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, () => _responseReadCompleteCallback?.Invoke(_httpContext)); _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); }
public void StatusCode_ThrowsWhenHasStarted() { var responseInformation = new ResponseFeature(); responseInformation.HasStarted = true; Assert.Throws <InvalidOperationException>(() => responseInformation.StatusCode = 400); Assert.Throws <InvalidOperationException>(() => responseInformation.ReasonPhrase = "Hello World"); }
public void StatusCode_MustBeGreaterThan99() { var responseInformation = new ResponseFeature(); Assert.Throws <ArgumentOutOfRangeException>(() => responseInformation.StatusCode = 99); Assert.Throws <ArgumentOutOfRangeException>(() => responseInformation.StatusCode = 0); Assert.Throws <ArgumentOutOfRangeException>(() => responseInformation.StatusCode = -200); responseInformation.StatusCode = 100; responseInformation.StatusCode = 200; responseInformation.StatusCode = 1000; }
public void StatusCode_DefaultsTo200() { // Arrange & Act var responseInformation = new ResponseFeature(); // Assert Assert.Equal(200, responseInformation.StatusCode); Assert.False(responseInformation.HasStarted); responseInformation.FireOnSendingHeaders(); Assert.True(responseInformation.HasStarted); }
public async Task StatusCode_DefaultsTo200() { // Arrange & Act var responseInformation = new ResponseFeature(); // Assert Assert.Equal(200, responseInformation.StatusCode); Assert.False(responseInformation.HasStarted); await responseInformation.FireOnSendingHeadersAsync(); Assert.True(responseInformation.HasStarted); Assert.True(responseInformation.Headers.IsReadOnly); }
public void OnStarting_ThrowsWhenHasStarted() { // Arrange var responseInformation = new ResponseFeature(); responseInformation.HasStarted = true; // Act & Assert Assert.Throws <InvalidOperationException>(() => { responseInformation.OnStarting((status) => { return(Task.FromResult(string.Empty)); }, state: "string"); }); }
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); var request = _httpContext.Request; request.Protocol = "HTTP/1.1"; request.Method = HttpMethods.Get; _httpContext.Features.Set <IHttpBodyControlFeature>(this); _httpContext.Features.Set <IHttpResponseFeature>(_responseFeature); _httpContext.Features.Set <IHttpResponseStartFeature>(_responseFeature); _httpContext.Features.Set <IHttpRequestLifetimeFeature>(_requestLifetimeFeature); _httpContext.Features.Set <IHttpResponseTrailersFeature>(_responseTrailersFeature); _responseStream = new ResponseStream(ReturnResponseMessageAsync, AbortRequest, () => AllowSynchronousIO, () => _responseReadCompleteCallback?.Invoke(_httpContext)); _responseFeature.Body = _responseStream; }
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(); contextFeatures.Set <IHttpRequestFeature>(new RequestFeature()); _responseFeature = new ResponseFeature(); contextFeatures.Set <IHttpResponseFeature>(_responseFeature); Context = application.CreateContext(contextFeatures); var httpContext = Context.HttpContext; 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); foreach (var header in request.Headers) { serverRequest.Headers.Append(header.Key, header.Value.ToArray()); } var requestContent = request.Content; if (requestContent != null) { foreach (var header in request.Content.Headers) { serverRequest.Headers.Append(header.Key, header.Value.ToArray()); } } _responseStream = new ResponseStream(ReturnResponseMessage, AbortRequest); httpContext.Response.Body = _responseStream; httpContext.Response.StatusCode = 200; httpContext.RequestAborted = _requestAbortedSource.Token; }
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(); contextFeatures.Set<IHttpRequestFeature>(new RequestFeature()); _responseFeature = new ResponseFeature(); contextFeatures.Set<IHttpResponseFeature>(_responseFeature); Context = application.CreateContext(contextFeatures); var httpContext = Context.HttpContext; 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); foreach (var header in request.Headers) { serverRequest.Headers.Append(header.Key, header.Value.ToArray()); } var requestContent = request.Content; if (requestContent != null) { foreach (var header in request.Content.Headers) { serverRequest.Headers.Append(header.Key, header.Value.ToArray()); } } _responseStream = new ResponseStream(ReturnResponseMessage, AbortRequest); httpContext.Response.Body = _responseStream; httpContext.Response.StatusCode = 200; httpContext.RequestAborted = _requestAbortedSource.Token; }