Пример #1
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);
        }
Пример #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);
            _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);
        }
        internal HttpContextBuilder(IHttpApplication <HostingApplication.Context> application)
        {
            _application = application ?? throw new ArgumentNullException(nameof(application));
            _httpContext = new DefaultHttpContext();

            var request = _httpContext.Request;

            request.Protocol = "HTTP/1.1";
            request.Method   = HttpMethods.Get;

            _httpContext.Features.Set <IHttpResponseFeature>(_responseFeature);
            var requestLifetimeFeature = new HttpRequestLifetimeFeature();

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

            _responseStream       = new ResponseStream(ReturnResponseMessageAsync, AbortRequest);
            _responseFeature.Body = _responseStream;
        }
Пример #4
0
        private async ValueTask <ResponseMessage> ProgressPipeline(
            HttpContext context,
            RequestDelegate next,
            RequestMessage requestMessage,
            ResponseMessage responseMessage,
            CancellationToken cancellationToken
            )
        {
            var requestFeature  = new RequestFeature(requestMessage);
            var responseFeature = new ResponseFeature(responseMessage);

            var requestLifetimeFeature = new HttpRequestLifetimeFeature
            {
                RequestAborted = cancellationToken
            };

            var serviceProviderFeature       = context.Features.Get <IServiceProvidersFeature>();
            var requestAuthenticationFeature = context.Features.Get <IHttpAuthenticationFeature>();
            var formFeature             = context.Features.Get <IFormFeature>();
            var responseTrailersFeature = context.Features.Get <IHttpResponseTrailersFeature>();

            //var httpResponseBodyFeature = context.Features.Get<IHttpResponseBodyFeature>();
            //var httpBodyControlFeature = context.Features.Get<IHttpResponseBodyPipeFeature>();
            //var httpResponseBodyFeature = context.Features.Get<IHttpResponseFeature>();

            GC.KeepAlive(context.Features);

            var features = new FeatureCollection();

            features.Set <IHttpRequestFeature>(new HttpRequestFeature());
            features.Set <IHttpResponseFeature>(new HttpResponseFeature());

//            features.Set<IHttpRequestFeature>(requestFeature);
//            features.Set<IHttpResponseFeature>(responseFeature);

            features.Set <IHttpRequestLifetimeFeature>(requestLifetimeFeature);
            features.Set <IHttpAuthenticationFeature>(requestAuthenticationFeature);
            features.Set <IServiceProvidersFeature>(serviceProviderFeature);
            features.Set <IFormFeature>(formFeature);
            features.Set <IHttpResponseTrailersFeature>(responseTrailersFeature);
            //features.Set<IHttpBodyControlFeature>(httpBodyControlFeature);
            //features.Set<IHttpResponseBodyFeature>(httpResponseBodyFeature);
            //features.Set<IHttpResponseBodyPipeFeature>(null);

            var ctx = new DefaultHttpContext(features);

            await MessageConverter.CopyRequestMessageToTarget(ctx.Request, requestMessage, cancellationToken);

            IServiceProvider serviceProvider;

            if (Configuration.InProcessScopeMode != RedTransportInProcessScopeMode.UseRootScope)
            {
                //creating a new scope for IServiceProvider.

                var factory = serviceProviderFeature.RequestServices.GetRequiredService <IServiceScopeFactory>();

                serviceProvider = factory.CreateScope().ServiceProvider;

                serviceProviderFeature = new ServiceProvidersFeature
                {
                    RequestServices = serviceProvider
                };
                features.Set <IServiceProvidersFeature>(serviceProviderFeature);
            }
            else
            {
                serviceProvider = serviceProviderFeature.RequestServices;
            }

            var memStream = new MemoryStream();

            ctx.Response.Body = memStream;

            //GC.KeepAlive(ctx.Response.Body);

            ctx.Response.RegisterForDispose(memStream);

            await next(ctx);

            return(await MessageConverter.FromResponseAsync(ctx.Response, cancellationToken));
        }
Пример #5
0
            internal RequestState(HttpRequestMessage request, PathString pathBase, IHttpApplication <Context> application)
            {
                _request              = request;
                _application          = application;
                _responseTcs          = new TaskCompletionSource <HttpResponseMessage>();
                _requestAbortedSource = new CancellationTokenSource();
                _pipelineFinished     = false;

                if (request.RequestUri.IsDefaultPort)
                {
                    request.Headers.Host = request.RequestUri.Host;
                }
                else
                {
                    request.Headers.Host = request.RequestUri.GetComponents(UriComponents.HostAndPort, UriFormat.UriEscaped);
                }

                var contextFeatures = new FeatureCollection();
                var requestFeature  = new RequestFeature();

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

                contextFeatures.Set <IHttpRequestLifetimeFeature>(requestLifetimeFeature);

                requestFeature.Protocol = "HTTP/" + request.Version.ToString(fieldCount: 2);
                requestFeature.Scheme   = request.RequestUri.Scheme;
                requestFeature.Method   = request.Method.ToString();

                var        fullPath = PathString.FromUriComponent(request.RequestUri);
                PathString remainder;

                if (fullPath.StartsWithSegments(pathBase, out remainder))
                {
                    requestFeature.PathBase = pathBase.Value;
                    requestFeature.Path     = remainder.Value;
                }
                else
                {
                    requestFeature.PathBase = string.Empty;
                    requestFeature.Path     = fullPath.Value;
                }

                requestFeature.QueryString = QueryString.FromUriComponent(request.RequestUri).Value;

                foreach (var header in request.Headers)
                {
                    requestFeature.Headers.Append(header.Key, header.Value.ToArray());
                }
                var requestContent = request.Content;

                if (requestContent != null)
                {
                    foreach (var header in request.Content.Headers)
                    {
                        requestFeature.Headers.Append(header.Key, header.Value.ToArray());
                    }
                }

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

                Context = application.CreateContext(contextFeatures);
            }