internal HttpContextBuilder(ApplicationWrapper application, bool allowSynchronousIO, bool preserveExecutionContext)
    {
        _application              = application ?? throw new ArgumentNullException(nameof(application));
        AllowSynchronousIO        = allowSynchronousIO;
        _preserveExecutionContext = preserveExecutionContext;
        _httpContext              = new DefaultHttpContext();
        _responseFeature          = new ResponseFeature(Abort);
        _requestLifetimeFeature   = new RequestLifetimeFeature(Abort);

        var request = _httpContext.Request;

        request.Protocol = HttpProtocol.Http11;
        request.Method   = HttpMethods.Get;

        _requestPipe = new Pipe();

        var responsePipe = new Pipe();

        _responseReaderStream       = new ResponseBodyReaderStream(responsePipe, ClientInitiatedAbort, ResponseBodyReadComplete);
        _responsePipeWriter         = new ResponseBodyPipeWriter(responsePipe, ReturnResponseMessageAsync);
        _responseFeature.Body       = new ResponseBodyWriterStream(_responsePipeWriter, () => AllowSynchronousIO);
        _responseFeature.BodyWriter = _responsePipeWriter;

        _httpContext.Features.Set <IHttpBodyControlFeature>(this);
        _httpContext.Features.Set <IHttpResponseFeature>(_responseFeature);
        _httpContext.Features.Set <IHttpResponseBodyFeature>(_responseFeature);
        _httpContext.Features.Set <IHttpRequestLifetimeFeature>(_requestLifetimeFeature);
        _httpContext.Features.Set <IHttpResponseTrailersFeature>(_responseTrailersFeature);
        _httpContext.Features.Set <IHttpUpgradeFeature>(new UpgradeFeature());
    }
        internal ResponseFeature CreateInternalServerResponse()
        {
            var dictionary = new HeaderDictionary();
            var response   = new ResponseFeature("HTTP/1.1", 500, "Internal Server Error",
                                                 Stream.Null, dictionary);

            return(response);
        }
        internal ResponseFeature CreateFourthResponse()
        {
            var dictionary = new HeaderDictionary();
            var response   = new ResponseFeature("HTTP/1.1", 204, "No Content",
                                                 Stream.Null, dictionary);

            return(response);
        }
Example #4
0
        private async Task HandleRequest <TContext>(string json, IHttpApplication <TContext> application)
        {
            var request  = RequestPacket.Parse(json);
            var response = request.Reply();

            using (var inputStream = request.ArgumentsStream)
                using (var outputStream = new MemoryStream())
                {
                    try
                    {
                        var features        = new FeatureCollection();
                        var requestFeature  = new RequestFeature();
                        var responseFeature = new ResponseFeature();

                        requestFeature.Path = request.Command;
                        requestFeature.Body = inputStream;
                        requestFeature.Headers["Content-Type"] = new[] { "application/json" };
                        responseFeature.Body = outputStream;

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

                        var context = application.CreateContext(features);

                        // hand off request to next layer
                        await application.ProcessRequestAsync(context);

                        if (responseFeature.StatusCode != 200)
                        {
                            response.Success = false;
                        }

                        // HttpResponse stream becomes body as is
                        var buffer = outputStream.ToArray();
                        if (buffer.Length > 0)
                        {
                            response.Body = new JRaw(new String(Encoding.UTF8.GetChars(buffer, 0, buffer.Length)));
                        }
                    }
                    catch (Exception e)
                    {
                        // updating the response object here so that the ResponseStream
                        // prints the latest state when being closed
                        response.Success = false;
                        response.Message = JsonConvert.ToString(e.ToString(), '"', StringEscapeHandling.Default);
                    }
                    finally
                    {
                        // actually write it
                        _writer.WriteLine(response);
                    }
                }
        }
        internal ResponseFeature CreateFirstResponse()
        {
            var output =
                "[{\"Id\":1,\"Name\":\"Namefc4b8794-943b-487a-9049-a8559232b9dd\"},{\"Id\":2,\"Name\":\"Name244bbada-3e83-43c8-82f7-5b2c4d72f2ed\"},{\"Id\":3,\"Name\":\"Nameec11d080-7f2d-47df-a483-7ff251cdda7a\"},{\"Id\":4,\"Name\":\"Name14ff5a3d-ad92-41f6-b4f6-9b94622f4968\"},{\"Id\":5,\"Name\":\"Name00f9e4cc-673e-4139-ba30-bfc273844678\"},{\"Id\":6,\"Name\":\"Name01f6660c-d1de-4c05-8567-8ae2759c4117\"},{\"Id\":7,\"Name\":\"Name60030a17-6316-427c-a744-b2fff6d9fe11\"},{\"Id\":8,\"Name\":\"Namefa61eb4c-9f9e-47a2-8dc5-15d8afe33f2d\"},{\"Id\":9,\"Name\":\"Name9b680c10-1727-43f5-83cf-c8eda3a63790\"},{\"Id\":10,\"Name\":\"Name9e66d797-d3a9-44ec-814d-aecde8040ced\"}]";
            var dictionary = new HeaderDictionary {
                { HeaderNames.ContentType, "application/json; charset=utf-8" }
            };
            var response = new ResponseFeature("HTTP/1.1", 200, "OK",
                                               new MemoryStream(Encoding.ASCII.GetBytes(output)), dictionary);

            return(response);
        }
        internal ResponseFeature CreateThirdResponse()
        {
            var output =
                "{\"Id\":1,\"Name\":\"Peter\"}";
            var dictionary = new HeaderDictionary {
                { HeaderNames.ContentType, "application/json; charset=utf-8" }
            };
            var response = new ResponseFeature("HTTP/1.1", 200, "OK",
                                               new MemoryStream(Encoding.ASCII.GetBytes(output)), dictionary);

            return(response);
        }
Example #7
0
        private Task ReturnThis(HttpContext context, ResponseFeature responseFeature)
        {
            context.Response.Body = responseFeature.Body;
            foreach (var kval in responseFeature.Headers)
            {
                context.Response.Headers.Add(kval);
            }

            context.Response.StatusCode = responseFeature.StatusCode;
            context.Response.HttpContext.Features.Get <IHttpResponseFeature>().ReasonPhrase =
                responseFeature.ReasonPhrase;
            return(Task.CompletedTask);
        }
Example #8
0
        private async Task ReturnThis(HttpContext context, ResponseFeature responseFeature)
        {
            await responseFeature.Stream.CopyToAsync(context.Response.Body).ConfigureAwait(false);

            foreach (var kval in responseFeature.Headers)
            {
                context.Response.Headers.Add(kval);
            }

            context.Response.StatusCode = responseFeature.StatusCode;
            context.Response.HttpContext.Features.Get <IHttpResponseFeature>().ReasonPhrase =
                responseFeature.ReasonPhrase;
        }
        internal ResponseFeature CreateSecondResponse()
        {
            var dictionary = new HeaderDictionary
            {
                { HeaderNames.Location, "http://localhost:13245/api/ApiCustomers" },
                { HeaderNames.ContentType, "application/json; charset=utf-8" }
            };
            var output   = "{\"Id\":21,\"Name\":\"Name4752cbf0-e365-43c3-aa8d-1bbc8429dbf8\"}";
            var response = new ResponseFeature("HTTP/1.1", 201, "Created",
                                               new MemoryStream(Encoding.ASCII.GetBytes(output)), dictionary);

            return(response);
        }
Example #10
0
        private async Task HandleRequest(string json)
        {
            var request  = RequestPacket.Parse(json);
            var response = request.Reply();

            using (var inputStream = request.ArgumentsStream)
                using (var outputStream = new MemoryStream())
                {
                    try
                    {
                        var httpRequest = new RequestFeature();
                        httpRequest.Path = request.Command;
                        httpRequest.Body = inputStream;
                        httpRequest.Headers["Content-Type"] = new[] { "application/json" };

                        var httpResponse = new ResponseFeature();
                        httpResponse.Body = outputStream;

                        var collection = new FeatureCollection();
                        collection[typeof(IHttpRequestFeature)]  = httpRequest;
                        collection[typeof(IHttpResponseFeature)] = httpResponse;

                        // hand off request to next layer
                        await _next(collection);

                        if (httpResponse.StatusCode != 200)
                        {
                            response.Success = false;
                        }

                        // HttpResponse stream becomes body as is
                        var buffer = outputStream.ToArray();
                        if (buffer.Length > 0)
                        {
                            response.Body = new JRaw(new String(Encoding.UTF8.GetChars(buffer, 0, buffer.Length)));
                        }
                    }
                    catch (Exception e)
                    {
                        // updating the response object here so that the ResponseStream
                        // prints the latest state when being closed
                        response.Success = false;
                        response.Message = e.ToString();
                    }
                    finally
                    {
                        // actually write it
                        _writer.WriteLine(response);
                    }
                }
        }
Example #11
0
        public StdioServer(TextReader input, ISharedTextWriter writer)
        {
            _input        = input;
            _writer       = writer;
            _cancellation = new CancellationTokenSource();

            _httpContextAccessor = new HttpContextAccessor();
            _httpContextFactory  = new HttpContextFactory(_httpContextAccessor);

            var features        = new FeatureCollection();
            var requestFeature  = new RequestFeature();
            var responseFeature = new ResponseFeature();

            features.Set <IHttpRequestFeature>(requestFeature);
            features.Set <IHttpResponseFeature>(responseFeature);
            Features = features;
        }
Example #12
0
        public StdioServer(TextReader input, ISharedTextWriter writer)
        {
            _input        = input;
            _writer       = writer;
            _cancellation = new CancellationTokenSource();

            _httpContextAccessor = new HttpContextAccessor();
            _objectPoolProvider  = new DefaultObjectPoolProvider();
            _formOptions         = Microsoft.Extensions.Options.Options.Create(new FormOptions());
            _httpContextFactory  = new HttpContextFactory(_objectPoolProvider, _formOptions, _httpContextAccessor);

            var features        = new FeatureCollection();
            var requestFeature  = new RequestFeature();
            var responseFeature = new ResponseFeature();

            features.Set <IHttpRequestFeature>(requestFeature);
            features.Set <IHttpResponseFeature>(responseFeature);
            Features = features;
        }
Example #13
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));
        }
 private void ElementInspector(IHttpResponseFeature input, ResponseFeature comparison)
 {
     Assert.Equal(comparison.StatusCode, input.StatusCode);
     Assert.Equal(comparison.ReasonPhrase, input.ReasonPhrase);
     Assert.Equal(comparison.Headers, input.Headers);
 }
Example #15
0
 internal HttpApplicationMultipart(ResponseFeature responseFeature) : this(responseFeature.Protocol,
                                                                           responseFeature.StatusCode, responseFeature.ReasonPhrase, responseFeature.Stream, responseFeature.Headers)
 {
 }