예제 #1
0
        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));
        }
예제 #2
0
        internal async Task <TestHeadersSink> ReceiveTrailingHeadersAsync(Http1TestStream stream)
        {
            if (_responseIsChunked)
            {
                TestHeadersSink headers = await ReadHeadersAsync().ConfigureAwait(false);

                stream.ReleaseNextReader();
                return(headers);
            }
            else
            {
                return(new TestHeadersSink());
            }
        }