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