예제 #1
0
 public DefaultHttpRequest(HttpContext context)
 {
     _context = context;
     //_features = context.HttpContextFeatures;
     this.RequestFeature = context.HttpContextFeatures.Get <IHttpRequestFeature>();
     _formFeature        = new FormFeature(this);
 }
예제 #2
0
        internal RequestState(IHttpRequestFeature requestFeature, IHttpContextFactory factory,
                              IFeatureCollection featureCollection)
        {
            _factory = factory;
            _requestAbortedSource = new CancellationTokenSource();
            _pipelineFinished     = false;

            var contextFeatures = new FeatureCollection(featureCollection);

            contextFeatures.Set(requestFeature);

            _responseStream  = new WriteOnlyResponseStream(AbortRequest);
            _responseFeature = new ResponseFeature(requestFeature.Protocol, 200, null, _responseStream, new HeaderDictionary())
            {
                Abort = Abort
            };
            contextFeatures.Set <IHttpResponseFeature>(_responseFeature);
            contextFeatures.Set <IHttpResponseBodyFeature>(new StreamResponseBodyFeature(_responseStream));
            var requestLifetimeFeature = new HttpRequestLifetimeFeature();

            contextFeatures.Set <IHttpRequestLifetimeFeature>(requestLifetimeFeature);
            requestLifetimeFeature.RequestAborted = _requestAbortedSource.Token;

            Context = _factory.Create(contextFeatures);
        }
예제 #3
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="areaName">The name of the area containing the Emails view folder if applicable</param>
        /// <returns></returns>
#if ASPNET5
        ActionContext CreateControllerContext(string areaName, IHttpRequestFeature requsetFeature)
        {
            var routeData = new Microsoft.AspNetCore.Routing.RouteData();

            routeData.Values["controller"] = EmailViewDirectoryName;

            // if populated will add searching the named Area for the view
            if (!string.IsNullOrWhiteSpace(areaName))
            {
                routeData.DataTokens["Area"] = areaName;
            }

            var actionDescriptor = new ActionDescriptor();

            actionDescriptor.RouteValues = routeData.Values.ToDictionary(kv => kv.Key, kv => kv.Value.ToString());
            FeatureCollection featureCollection = new FeatureCollection();
            var requsetFeature_local            = new HttpRequestFeature();

            requsetFeature_local.Method   = "GET";
            requsetFeature_local.Protocol = requsetFeature?.Protocol;
            requsetFeature_local.PathBase = requsetFeature?.PathBase;
            requsetFeature_local.Scheme   = requsetFeature?.Scheme;
            featureCollection.Set <IHttpRequestFeature>(requsetFeature_local);
            featureCollection.Set <IHttpResponseFeature>(new HttpResponseFeature());
            var httpContext = new DefaultHttpContext(featureCollection);

            httpContext.RequestServices = serviceProvider;
            var actionContext = new ActionContext(httpContext, routeData, actionDescriptor);

            actionContext.RouteData = routeData;

            return(actionContext);
        }
예제 #4
0
파일: Prerender.cs 프로젝트: Xoadra/PreCore
        public static async Task <RenderToStringResult> Prerender(this HttpRequest trans)
        {
            // Grab key website data that will be serialized for use in universal rendering
            INodeServices       node = trans.HttpContext.RequestServices.GetRequiredService <INodeServices>( );
            IHostingEnvironment zone = trans.HttpContext.RequestServices.GetRequiredService <IHostingEnvironment>( );
            IHttpRequestFeature item = trans.HttpContext.Features.Get <IHttpRequestFeature>( );
            // Identify web app's host and subroute to target for prerending server-side
            string root = zone.ContentRootPath;
            string path = item.RawTarget;
            // Build out the url from the previous parameters for prerendering it's content
            string url = $"{ trans.Scheme }://{ trans.Host }{ path }";
            // Allow for the passing of custom data as a request for the frontend app
            TransferData data = new TransferData( );

            // Customized data sent to the frontend is sent through here as a parameter
            // Feel free to add more custom data here through TransferData class fields
            data.elements           = trans.Decode( );
            data.thisCameFromDotNET = "The server beckons thee!!!";
            // Requires a cancellation token for performing universal app prerendering
            CancellationTokenSource origin = new CancellationTokenSource( );
            CancellationToken       exe    = origin.Token;
            // Locate the generated server-side bundle used for the initial prerendering
            JavaScriptModuleExport js = new JavaScriptModuleExport(root + "/Node/server.bundle");

            // Serialize and prerender the frontend app as a universal/isomorphic one
            return(await Prerenderer.RenderToString("/", node, exe, js, url, path, data, 30000, trans.PathBase.ToString( )));
        }
예제 #5
0
        internal RequestState(IHttpRequestFeature requestFeature, IHttpContextFactory factory,
                              IFeatureCollection featureCollection)
        {
            _factory = factory;
            _requestAbortedSource = new CancellationTokenSource();
            _pipelineFinished     = false;

            var contextFeatures = new FeatureCollection(featureCollection);

            contextFeatures.Set(requestFeature);
            _responseFeature = new ResponseFeature {
                Protocol = requestFeature.Protocol
            };
            contextFeatures.Set <IHttpResponseFeature>(_responseFeature);
            var requestLifetimeFeature = new HttpRequestLifetimeFeature();

            contextFeatures.Set <IHttpRequestLifetimeFeature>(requestLifetimeFeature);

            _responseStream                       = new WriteOnlyResponseStream(AbortRequest);
            _responseFeature.Body                 = _responseStream;
            _responseFeature.StatusCode           = 200;
            requestLifetimeFeature.RequestAborted = _requestAbortedSource.Token;

            Context = _factory.Create(contextFeatures);
        }
예제 #6
0
 public static HttpRequest ParseRequest(IHttpRequestFeature _requestFeature)
 {
     return(new(QueryString.FromUriComponent(_requestFeature.QueryString),
                new HttpMethod(_requestFeature.Method),
                _requestFeature.Path,
                _requestFeature.Body));
 }
예제 #7
0
 protected override void PostMarshallRequestFeature(
     IHttpRequestFeature aspNetCoreRequestFeature,
     APIGatewayProxyRequest apiGatewayRequest,
     ILambdaContext lambdaContext)
 {
     aspNetCoreRequestFeature.PathBase = "";
     aspNetCoreRequestFeature.Path     = apiGatewayRequest.Path;
 }
예제 #8
0
 void IFeatureCache.CheckFeaturesRevision()
 {
     if (_cachedFeaturesRevision != _features.Revision)
     {
         _request = null;
         _cachedFeaturesRevision = _features.Revision;
     }
 }
예제 #9
0
 void IFeatureCache.CheckFeaturesRevision()
 {
     if (_cachedFeaturesRevision != _features.Revision)
     {
         _request = null;
         _cachedFeaturesRevision = _features.Revision;
     }
 }
예제 #10
0
 internal WebContext(IFeatureCollection features)
 {
     this.features   = features;
     connection      = new DefaultConnectionInfo(features);
     fRequest        = features.Get <IHttpRequestFeature>();
     fRequestCookies = new RequestCookiesFeature(features);
     fResponse       = features.Get <IHttpResponseFeature>();
     fWebSocket      = features.Get <IHttpWebSocketFeature>();
 }
        /// <summary>
        /// Convert the JSON document received from API Gateway in the ASP.NET Core IHttpRequestFeature object.
        /// IHttpRequestFeature is then passed into IHttpApplication to create the ASP.NET Core request objects.
        /// </summary>
        /// <param name="requestFeatures"></param>
        /// <param name="apiGatewayRequest"></param>
        protected void MarshallRequest(IHttpRequestFeature requestFeatures, APIGatewayProxyRequest apiGatewayRequest)
        {
            requestFeatures.Scheme = "https";
            requestFeatures.Path   = apiGatewayRequest.Path;
            requestFeatures.Method = apiGatewayRequest.HttpMethod;

            // API Gateway delivers the query string in a dictionary but must be reconstructed into the full query string
            // before passing into ASP.NET Core framework.
            var queryStringParameters = apiGatewayRequest.QueryStringParameters;

            if (queryStringParameters != null)
            {
                StringBuilder sb      = new StringBuilder("?");
                var           encoder = UrlEncoder.Default;
                foreach (var kvp in queryStringParameters)
                {
                    if (sb.Length > 1)
                    {
                        sb.Append("&");
                    }
                    sb.Append($"{encoder.Encode(kvp.Key)}={encoder.Encode(kvp.Value.ToString())}");
                }
                requestFeatures.QueryString = sb.ToString();
            }

            var headers = apiGatewayRequest.Headers;

            if (headers != null)
            {
                foreach (var kvp in headers)
                {
                    requestFeatures.Headers[kvp.Key] = kvp.Value?.ToString();
                }
            }

            if (!requestFeatures.Headers.ContainsKey("Host"))
            {
                var apiId = apiGatewayRequest.RequestContext?.ApiId ?? "";
                var stage = apiGatewayRequest.RequestContext?.Stage ?? "";

                requestFeatures.Headers["Host"] = $"apigateway-{apiId}-{stage}";
            }

            if (!string.IsNullOrEmpty(apiGatewayRequest.Body))
            {
                Byte[] binaryBody;
                if (apiGatewayRequest.IsBase64Encoded)
                {
                    binaryBody = Convert.FromBase64String(apiGatewayRequest.Body);
                }
                else
                {
                    binaryBody = UTF8Encoding.UTF8.GetBytes(apiGatewayRequest.Body);
                }
                requestFeatures.Body = new MemoryStream(binaryBody);
            }
        }
예제 #12
0
 protected override void PostMarshallRequestFeature(
     IHttpRequestFeature aspNetCoreRequestFeature,
     APIGatewayProxyRequest apiGatewayRequest,
     ILambdaContext lambdaContext)
 {
     //The base path mapping gets stripped off in AWS. We still let it strip off but just set it at a different time as an override.
     aspNetCoreRequestFeature.PathBase = "";
     aspNetCoreRequestFeature.Path     = apiGatewayRequest.Path;
 }
예제 #13
0
        private DefaultHttpContext PrepareDefaultHttpContext(IHttpRequestFeature request)
        {
            var httpContext       = new DefaultHttpContext();
            var featureCollection = new FeatureCollection();

            featureCollection.Set <IHttpRequestFeature>(request);
            httpContext.Initialize(featureCollection);

            return(httpContext);
        }
 void IFeatureCache.CheckFeaturesRevision()
 {
     if (_cachedFeaturesRevision != _features.Revision)
     {
         _request = null;
         _query = null;
         _form = null;
         _cookies = null;
         _cachedFeaturesRevision = _features.Revision;
     }
 }
예제 #15
0
 void IFeatureCache.CheckFeaturesRevision()
 {
     if (_cachedFeaturesRevision != _features.Revision)
     {
         _request = null;
         _query   = null;
         _form    = null;
         _cookies = null;
         _cachedFeaturesRevision = _features.Revision;
     }
 }
예제 #16
0
        public async Task <IHttpResponseFeature> ProcessRequestAsync(IHttpRequestFeature request)
        {
            if (_context == null)
            {
                throw new InvalidOperationException("Server Not Started");
            }

            var frame = _context.FrameFactory(request);
            await frame.ProcessRequestAsync();

            return(frame.Get <IHttpResponseFeature>());
        }
예제 #17
0
        private async Task AssertExecution(IHttpRequestFeature requestFeature, IHttpResponseFeature responseFeature,
                                           BatchMiddlewareEvents batchMiddlewareEvents,
                                           params ResponseFeature[] responseFeatures)
        {
            var featureCollection = new FeatureCollection();

            featureCollection.Set(requestFeature);
            featureCollection.Set(responseFeature);
            var defaultContext = new DefaultHttpContext(featureCollection);
            var middleware     = CreateMiddleware(CreateRequestDelegate(responseFeatures), batchMiddlewareEvents);
            await middleware.Invoke(defaultContext).ConfigureAwait(false);
        }
        private bool IsValidForPrerenderPage(HttpRequest request, IHttpRequestFeature requestFeature)
        {
            var userAgent   = request.Headers[Constants.HttpHeader_UserAgent];
            var rawUrl      = requestFeature.RawTarget;
            var relativeUrl = request.Path.ToString();

            // check if follows google search engine suggestion
            if (request.Query.Keys.Any(a => a.Equals(Constants.EscapedFragment, StringComparison.OrdinalIgnoreCase)))
            {
                return(true);
            }

            // check if has user agent
            if (string.IsNullOrEmpty(userAgent))
            {
                return(false);
            }

            // check if it's crawler user agent.
            var crawlerUserAgentPattern = string.IsNullOrEmpty(Configuration.CrawlerUserAgentPattern) ? Constants.CrawlerUserAgentPattern : Configuration.CrawlerUserAgentPattern;

            if (string.IsNullOrEmpty(crawlerUserAgentPattern) ||
                !Regex.IsMatch(userAgent, crawlerUserAgentPattern, RegexOptions.IgnorePatternWhitespace | RegexOptions.IgnoreCase))
            {
                return(false);
            }

            // check if the extenion matchs default extension
            if (Regex.IsMatch(relativeUrl, DefaultIgnoredExtensions, RegexOptions.IgnorePatternWhitespace))
            {
                return(false);
            }

            if (!string.IsNullOrEmpty(Configuration.AdditionalExtensionPattern) && Regex.IsMatch(relativeUrl, Configuration.AdditionalExtensionPattern, RegexOptions.IgnorePatternWhitespace))
            {
                return(false);
            }

            if (!string.IsNullOrEmpty(Configuration.BlackListPattern) &&
                Regex.IsMatch(rawUrl, Configuration.BlackListPattern, RegexOptions.IgnorePatternWhitespace))
            {
                return(false);
            }

            if (!string.IsNullOrEmpty(Configuration.WhiteListPattern) &&
                Regex.IsMatch(rawUrl, Configuration.WhiteListPattern, RegexOptions.IgnorePatternWhitespace))
            {
                return(true);
            }

            return(false);
        }
예제 #19
0
        protected override void PostMarshallRequestFeature(
            IHttpRequestFeature aspNetCoreRequestFeature,
            APIGatewayProxyRequest lambdaRequest,
            ILambdaContext lambdaContext)
        {
            base.PostMarshallRequestFeature(aspNetCoreRequestFeature, lambdaRequest, lambdaContext);

            AppLogger.LogJson(new
            {
                Event             = "Request",
                RequestId         = lambdaContext.AwsRequestId,
                RequestPath       = lambdaRequest.Path,
                RequestParameters = lambdaRequest.PathParameters,
                Method            = lambdaRequest.HttpMethod,
            });
        }
예제 #20
0
        public RequestFrame(IHttpApplication <TContext> application, ILogger <RequestFrame <TContext> > logger,
                            IHttpRequestFeature requestContext)
            : base(requestContext)
        {
            if (application == null)
            {
                throw new ArgumentNullException(nameof(application));
            }
            if (logger == null)
            {
                throw new ArgumentNullException(nameof(logger));
            }

            _application = application;
            _logger      = logger;
        }
예제 #21
0
        public HalHttpRequest(HttpContext context)
        {
            this.HttpContext = context
                               ?? throw new ArgumentNullException(nameof(context));

            this.queryFeature = context.Features.Get <IQueryFeature>()
                                ?? throw new ArgumentException(
                                          "context should contain a IQueryFeature",
                                          nameof(context));

            this.requestFeature = context.Features.Get <IHttpRequestFeature>()
                                  ?? throw new ArgumentException(
                                            "context should contain a IHttpRequestFeature",
                                            nameof(context));

            this.requestCookiesFeature = context.Features.Get <IRequestCookiesFeature>();
        }
        public void GetParameterAliasOrSelf_ReturnsExpectedAliasValue()
        {
            // Arrange
            HttpContext         context        = new DefaultHttpContext();
            HttpRequest         request        = context.Request;
            IHttpRequestFeature requestFeature = request.HttpContext.Features.Get <IHttpRequestFeature>();

            requestFeature.QueryString = "?@p=[1, 2, null, 7, 8]";

            ODataTemplateTranslateContext translateContext = new ODataTemplateTranslateContext(context);

            // Act
            string alias = translateContext.GetParameterAliasOrSelf("@p");

            // Assert
            Assert.Equal("[1, 2, null, 7, 8]", alias);
        }
예제 #23
0
        private static void UpdateScheme(HttpContext httpContext, IHttpRequestFeature requestFeature)
        {
            if (httpContext.Request.Headers.TryGetValue("X-Forwarded-Proto", out var header) &&
                header.Count == 1)
            {
                switch (header[0])
                {
                case "http":
                    requestFeature.Scheme = "http";
                    break;

                case "https":
                    requestFeature.Scheme = "https";
                    break;
                }
            }
        }
        public void GetParameterAliasOrSelf_ReturnsExpectedAliasValue_ForMultiple()
        {
            // Arrange
            HttpContext         context        = new DefaultHttpContext();
            HttpRequest         request        = context.Request;
            IHttpRequestFeature requestFeature = request.HttpContext.Features.Get <IHttpRequestFeature>();

            requestFeature.QueryString = "?@p=@age&@age=@para1&@para1='ab''c'";

            ODataTemplateTranslateContext translateContext = new ODataTemplateTranslateContext(context);

            // Act
            string alias = translateContext.GetParameterAliasOrSelf("@p");

            // Assert
            Assert.Equal("'ab''c'", alias);
        }
        public void GetParameterAliasOrSelf_Throws_ForInfiniteLoopParameterAlias()
        {
            // Arrange
            HttpContext         context        = new DefaultHttpContext();
            HttpRequest         request        = context.Request;
            IHttpRequestFeature requestFeature = request.HttpContext.Features.Get <IHttpRequestFeature>();

            requestFeature.QueryString = "?@p=@age&@age=@p1&@p1=@p";

            ODataTemplateTranslateContext translateContext = new ODataTemplateTranslateContext(context);

            // Act
            Action test = () => translateContext.GetParameterAliasOrSelf("@p");

            // Assert
            ExceptionAssert.Throws <ODataException>(test, "The parameter alias '@p' is in an infinite loop.");
        }
        public void GetParameterAliasOrSelf_Throws_ForMissingParameterAlias()
        {
            // Arrange
            HttpContext         context        = new DefaultHttpContext();
            HttpRequest         request        = context.Request;
            IHttpRequestFeature requestFeature = request.HttpContext.Features.Get <IHttpRequestFeature>();

            requestFeature.QueryString = "?@p=@age&@para1='abc'";

            ODataTemplateTranslateContext translateContext = new ODataTemplateTranslateContext(context);

            // Act
            Action test = () => translateContext.GetParameterAliasOrSelf("@p");

            // Assert
            ExceptionAssert.Throws <ODataException>(test, "Missing the parameter alias '@age' in the request query string.");
        }
예제 #27
0
        public HalHttpRequestFeature(IHttpRequestFeature requestFeature)
        {
            if (requestFeature == null)
            {
                throw new ArgumentNullException(nameof(requestFeature));
            }

            this.Protocol    = requestFeature.Protocol;
            this.Scheme      = requestFeature.Scheme;
            this.Method      = requestFeature.Method;
            this.PathBase    = requestFeature.PathBase;
            this.Path        = requestFeature.Path;
            this.QueryString = requestFeature.QueryString;
            this.RawTarget   = requestFeature.RawTarget;
            this.Headers     = requestFeature.Headers;
            this.Body        = requestFeature.Body;
        }
예제 #28
0
        public IActionResult Error() //500 numaralı status kodlarda yani C# kodlarının ürettiği exceptionlar için
        {
            IExceptionHandlerPathFeature exceptionHandlerPath = HttpContext.Features.Get <IExceptionHandlerPathFeature>();
            IHttpRequestFeature          httpRequestFeature   = HttpContext.Features.Get <IHttpRequestFeature>();

            var jsonSerializerSettings = new JsonSerializerSettings();

            //Json serileştirme ayarlarımız
            jsonSerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
            jsonSerializerSettings.Formatting            = Formatting.Indented;

            var errorDto = new ErrorDto
            {
                CreateDate    = DateTime.Now,
                QueryString   = exceptionHandlerPath.Path.QueryStringFromUrl(),
                IsAjaxRequest = HttpContext.Request.IsAjaxRequest(),
                RequestType   = Enum.Parse <RequestType>(httpRequestFeature.Method),
                StatusCode    = 500,
                Url           = exceptionHandlerPath.Path,
                Username      = "******",
                Exception     = JsonConvert.SerializeObject(exceptionHandlerPath.Error, jsonSerializerSettings)
            };

            //Hatayı veritabanına kaydet
            ErrorLogger.LogException(errorDto);

            HttpContext.Response.StatusCode = 200;

            //Eğer istek ajax isteği ise
            if (errorDto.IsAjaxRequest)
            {
                return(Json(new JsonResponse
                {
                    Status = JsonResponseStatus.Error,
                    Message = "İşlem esnasında bir hata oluştu.",
                    Result = errorDto
                }));
            }


            var errorVM = Mapper.Map <ErrorDto, ErrorVM>(errorDto);

            errorVM.Message = exceptionHandlerPath.Error.Message;

            return(View("_Error", errorVM));
        }
예제 #29
0
        public HalHttpContext(
            HttpContext context,
            IHttpRequestFeature requestFeature)
        {
            this.context = context
                           ?? throw new ArgumentNullException(nameof(context));

            var halRequestFeature  = new HalHttpRequestFeature(requestFeature);
            var halResponseFeature = new HalHttpResponseFeature();

            this.Features = new HalFeatureCollection(
                context.Features,
                halRequestFeature,
                halResponseFeature);
            this.Request  = new HalHttpRequest(this);
            this.Response = new HalHttpResponse(this);
        }
예제 #30
0
        protected virtual IHttpRequestFeature CreateRequest(IHttpRequestFeature originalRequest, IUntypedCall call, Encoding requestEncoding)
        {
            var headers = new Dictionary <string, StringValues>(originalRequest.Headers, StringComparer.Ordinal);
            var result  = new HttpRequestFeature
            {
                Protocol    = originalRequest.Protocol,
                Method      = originalRequest.Method,
                Scheme      = originalRequest.Scheme,
                Path        = originalRequest.Path,
                PathBase    = originalRequest.PathBase,
                QueryString = originalRequest.QueryString,
                RawTarget   = originalRequest.RawTarget,
                Headers     = new HeaderDictionary(headers),
                Body        = new MemoryStream(requestEncoding.GetBytes(call.RawJson))
            };

            log.LogTrace($"Copied request: [{result.Protocol}] [{result.Method}] [{result.Scheme}] [{result.Path}] [{result.PathBase}] [{result.QueryString}] [{result.RawTarget}], [{headers.Count}] headers");
            return(result);
        }
예제 #31
0
        public void GetParameterAliasOrSelf_ReturnsNull_IfAliasNull()
        {
            // Arrange
            HttpContext         context        = new DefaultHttpContext();
            HttpRequest         request        = context.Request;
            IHttpRequestFeature requestFeature = request.HttpContext.Features.Get <IHttpRequestFeature>();

            requestFeature.QueryString = "?@p=[1, 2, null, 7, 8]";

            ODataTemplateTranslateContext translateContext = new ODataTemplateTranslateContext
            {
                HttpContext = context
            };

            // Act
            string alias = translateContext.GetParameterAliasOrSelf(null);

            // Assert
            Assert.Null(alias);
        }
예제 #32
0
        public async Task <IActionResult> Index([FromServices] ISpaPrerenderer prerenderer, [FromServices] IMemoryCache cache)
        {
            IHttpRequestFeature requestFeature = this.Request.HttpContext.Features.Get <IHttpRequestFeature>();
            string unencodedPathAndQuery       = requestFeature.RawTarget;

            RenderToStringResult prerenderResult = await cache.GetOrCreateAsync(unencodedPathAndQuery, entry =>
            {
                entry.AbsoluteExpirationRelativeToNow = TimeSpan.FromDays(10);
                entry.SlidingExpiration = TimeSpan.FromDays(3);
                return(prerenderer.RenderToString("angular/dist-server/server", customDataParameter: new { request = this.Request.AbstractHttpContextRequestInfo() }));
            });

            this.ViewData["SpaHtml"]      = prerenderResult.Html;
            this.ViewData["Title"]        = prerenderResult.Globals["title"];
            this.ViewData["Scripts"]      = prerenderResult.Globals["scripts"];
            this.ViewData["Styles"]       = prerenderResult.Globals["styles"];
            this.ViewData["Meta"]         = prerenderResult.Globals["meta"];
            this.ViewData["Links"]        = prerenderResult.Globals["links"];
            this.ViewData["TransferData"] = prerenderResult.Globals["transferData"];

            return(View());
        }