async Task <HttpRequestFeature> CreateRequesteAsync(Stream stream)
        {
            var lineReader  = new ByLineReader(stream, 1024);
            var requestLine = await lineReader.NextLineAsync().ConfigureAwait(false);

            var firstLine = HttpParser.GetAsciiString(requestLine);
            var parts     = firstLine.Split(' ');
            var result    = new HttpRequestFeature();

            result.Method = parts[0];
            var uri = new Uri("http://localhost" + parts[1]);

            result.Protocol = parts[2];
            for (; ;)
            {
                var line = await lineReader.NextLineAsync().ConfigureAwait(false);

                if (line.Count == 0)
                {
                    break;
                }
                (var name, var values) = HttpParser.ParseHeaderNameValue(line);
                result.Headers.Add(name, new Microsoft.Extensions.Primitives.StringValues(values.ToArray()));
            }
            result.Scheme      = uri.Scheme;
            result.Path        = PathString.FromUriComponent(uri);
            result.QueryString = QueryString.FromUriComponent(uri).Value;
            result.Body        = new StreamWithPrefix(lineReader.Remaining, stream, result.Headers.ContentLength);
            return(result);
        }
Beispiel #2
0
        private async Task PopulateRequestAsync(Stream stream, IOwinRequest request)
        {
            var lineReader  = new ByLineReader(stream, 1024);
            var requestLine = await lineReader.NextLineAsync().ConfigureAwait(false);

            var firstLine = HttpParser.GetAsciiString(requestLine);
            var parts     = firstLine.Split(' ');

            request.Method   = parts[0];
            request.Protocol = parts[2];
            var uri = new Uri("http://localhost" + parts[1]);

            for (; ;)
            {
                var line = await lineReader.NextLineAsync().ConfigureAwait(false);

                if (line.Count == 0)
                {
                    break;
                }
                (var name, var values) = HttpParser.ParseHeaderNameValue(line);
                request.Headers.Add(name, values.ToArray());
            }
            request.Scheme      = uri.Scheme;
            request.Path        = PathString.FromUriComponent(uri);
            request.QueryString = QueryString.FromUriComponent(uri);
            request.Body        = new StreamWithPrefix(lineReader.Remaining, stream, null);
        }
        public async Task TestMalformedHeaders()
        {
            var ms = new MemoryStream();

            ms.Write(Encoding.UTF8.GetBytes("aaa\nsecond longer line\n"));
            ms.Flush();
            ms.Position = 0;
            var testee = new ByLineReader(ms, 4);

            Assert.Equal("aaa", Encoding.UTF8.GetString(await testee.NextLineAsync()));
            Assert.Equal("second longer line", Encoding.UTF8.GetString(await testee.NextLineAsync()));
            await Assert.ThrowsAsync <IOException>(() => testee.NextLineAsync());
        }
        public async Task TestWithBufferAlignmentAndInitialBufferSizeTooShort()
        {
            var ms = new MemoryStream();

            ms.Write(Encoding.UTF8.GetBytes("aaa\nsecond longer line\n"));
            ms.Flush();
            ms.Position = 0;
            var testee = new ByLineReader(ms, 4);

            Assert.Equal("aaa", Encoding.UTF8.GetString(await testee.NextLineAsync()));
            Assert.Equal("second longer line", Encoding.UTF8.GetString(await testee.NextLineAsync()));
            Assert.Empty(testee.Remaining);
        }
Beispiel #5
0
        protected override async Task <HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            ValidateAndNormalizeRequest(request);
            var stream = await _dial.DialAsync(request, cancellationToken).ConfigureAwait(false);

            request.Properties.Add(UnderlyingStreamProperty, stream);
            var headerWriter = new HttpHeaderWriter(stream, 4096);
            await headerWriter.WriteMethodAndHeadersAsync(request).ConfigureAwait(false);

            await headerWriter.FlushAsync().ConfigureAwait(false);

            if (request.Content != null)
            {
                await request.Content.CopyToAsync(stream).ConfigureAwait(false);
            }
            await stream.FlushAsync().ConfigureAwait(false);

            await((stream as IWithCloseWriteSupport)?.CloseWriteAsync() ?? Task.CompletedTask).ConfigureAwait(false);
            var responseContent = new DialResponseContent();
            var response        = new HttpResponseMessage {
                RequestMessage = request, Content = responseContent
            };
            var lineReader = new ByLineReader(stream, 4096);

            ParseStatusLine(response, await lineReader.NextLineAsync().ConfigureAwait(false));
            for (; ;)
            {
                var line = await lineReader.NextLineAsync().ConfigureAwait(false);

                if (line.Count == 0)
                {
                    break;
                }
                try
                {
                    (var name, var value) = HttpParser.ParseHeaderNameValue(line);
                    if (!response.Headers.TryAddWithoutValidation(name, value))
                    {
                        response.Content.Headers.TryAddWithoutValidation(name, value);
                    }
                }
                catch (FormatException ex)
                {
                    throw new HttpRequestException("Error parsing header", ex);
                }
            }
            responseContent.SetContent(lineReader.Remaining, stream);
            return(response);
        }
        public async Task TestWithLf()
        {
            var ms = new MemoryStream();

            ms.Write(Encoding.UTF8.GetBytes("first line\nsecond longer line\nthird line\nhello\n\n"));
            ms.Flush();
            ms.Position = 0;
            var testee = new ByLineReader(ms, 4);

            Assert.Equal("first line", Encoding.UTF8.GetString(await testee.NextLineAsync()));
            Assert.Equal("second longer line", Encoding.UTF8.GetString(await testee.NextLineAsync()));
            Assert.Equal("third line", Encoding.UTF8.GetString(await testee.NextLineAsync()));
            Assert.Equal("hello", Encoding.UTF8.GetString(await testee.NextLineAsync()));
            Assert.Equal("", Encoding.UTF8.GetString(await testee.NextLineAsync()));
        }