Exemple #1
0
        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;
        }
Exemple #4
0
        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");
            });
        }
Exemple #7
0
        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;
        }
Exemple #8
0
            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;
            }
Exemple #9
0
            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;
            }