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); } } }
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); } } }
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; }
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; }
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)); }