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 void QueryReturnsParsedQueryCollection() { // Arrange var features = new FeatureCollection(); var request = new HttpRequestFeature(); request.QueryString = "foo=bar"; features.Add(typeof(IHttpRequestFeature), request); var provider = new QueryFeature(features); // Act var queryCollection = provider.Query; // Assert Assert.Equal("bar", queryCollection["foo"]); }
public ServerRequest(Frame frame) { _frame = frame; _features = new FeatureCollection(); PopulateFeatures(); }
internal RequestState(HttpRequestMessage request, PathString pathBase, CancellationToken cancellationToken) { _request = request; _responseTcs = new TaskCompletionSource<HttpResponseMessage>(); if (request.RequestUri.IsDefaultPort) { request.Headers.Host = request.RequestUri.Host; } else { request.Headers.Host = request.RequestUri.GetComponents(UriComponents.HostAndPort, UriFormat.UriEscaped); } FeatureCollection = new FeatureCollection(); HttpContext = new DefaultHttpContext(FeatureCollection); HttpContext.SetFeature<IHttpRequestFeature>(new RequestFeature()); _responseFeature = new ResponseFeature(); HttpContext.SetFeature<IHttpResponseFeature>(_responseFeature); var serverRequest = HttpContext.Request; serverRequest.Protocol = "HTTP/" + request.Version.ToString(2); serverRequest.Scheme = request.RequestUri.Scheme; serverRequest.Method = request.Method.ToString(); var fullPath = PathString.FromUriComponent(request.RequestUri); PathString remainder; if (fullPath.StartsWithSegments(pathBase, out remainder)) { serverRequest.PathBase = pathBase; serverRequest.Path = remainder; } else { serverRequest.PathBase = PathString.Empty; serverRequest.Path = fullPath; } serverRequest.QueryString = QueryString.FromUriComponent(request.RequestUri); // TODO: serverRequest.CallCancelled = cancellationToken; foreach (var header in request.Headers) { serverRequest.Headers.AppendValues(header.Key, header.Value.ToArray()); } var requestContent = request.Content; if (requestContent != null) { foreach (var header in request.Content.Headers) { serverRequest.Headers.AppendValues(header.Key, header.Value.ToArray()); } } _responseStream = new ResponseStream(CompleteResponse); HttpContext.Response.Body = _responseStream; HttpContext.Response.StatusCode = 200; }