internal async Task <HttpTestRequest> ReceiveRequestAsync(Http1TestStream stream) { string request = await ReadLineAsync().ConfigureAwait(false); Match match = Regex.Match(request, @"^([^ ]+) ([^ ]+) HTTP/(\d).(\d)$"); if (!match.Success) { throw new Exception("Invalid request line."); } string method = match.Groups[1].Value; string pathAndQuery = match.Groups[2].Value; int versionMajor = int.Parse(match.Groups[3].Value, NumberStyles.None, CultureInfo.InvariantCulture); int versionMinor = int.Parse(match.Groups[4].Value, NumberStyles.None, CultureInfo.InvariantCulture); var version = new Version(versionMajor, versionMinor); TestHeadersSink headers = await ReadHeadersAsync().ConfigureAwait(false); _responseContentLength = headers.TryGetSingleValue("content-length", out string?contentLength) ? int.Parse(contentLength, NumberStyles.None, CultureInfo.InvariantCulture) : method switch { "GET" or "HEAD" or "DELETE" or "TRACE" => 0, _ => (int?)null }; _responseIsChunked = headers.TryGetSingleValue("transfer-encoding", out string?transferEncoding) && transferEncoding == "chunked"; if (!_responseIsChunked && _responseContentLength == 0) { stream.ReleaseNextReader(); } return(new HttpTestRequest(method, pathAndQuery, version, headers)); }
internal async Task <TestHeadersSink> ReceiveTrailingHeadersAsync(Http1TestStream stream) { if (_responseIsChunked) { TestHeadersSink headers = await ReadHeadersAsync().ConfigureAwait(false); stream.ReleaseNextReader(); return(headers); } else { return(new TestHeadersSink()); } }