Exemplo n.º 1
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);
                    }
                }
        }
Exemplo n.º 2
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);
                    }
                }
        }
Exemplo n.º 3
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;
        }
Exemplo n.º 4
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;
        }
Exemplo n.º 5
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));
        }