public async Task Send_ChunkedRequest_Success(int testIdx, TestHeadersSink requestHeaders, List <string> requestContent, TestHeadersSink requestTrailingHeaders) { await RunSingleStreamTest( async (client, serverUri) => { await ClientSendHelperAsync(client, serverUri, testIdx, requestHeaders, requestContent, requestTrailingHeaders); }, async server => { HttpTestFullRequest request = await server.ReceiveAndSendAsync(); if (request.Version.Major == 1) { Assert.Equal("chunked", request.Headers.GetSingleValue("transfer-encoding")); } Assert.True(request.Headers.Contains(requestHeaders)); Assert.Equal(string.Join("", requestContent), request.Content); Assert.True(request.TrailingHeaders.Contains(requestTrailingHeaders)); }); }
public async Task Receive_NonChunkedResponse_Success(int testIdx, TestHeadersSink responseHeaders, List <string> responseContent) { _ = testIdx; // only used to assist debugging. await RunSingleStreamTest( async (clientRequest, serverUri) => { clientRequest.ConfigureRequest(contentLength: 0, hasTrailingHeaders: false); clientRequest.WriteRequest(HttpMethod.Get, serverUri); await clientRequest.CompleteRequestAsync(); TestHeadersSink actualResponseHeaders = await clientRequest.ReadAllHeadersAsync(); Assert.True(actualResponseHeaders.Contains(responseHeaders)); string actualResponseContent = await clientRequest.ReadAllContentAsStringAsync(); Assert.Equal(string.Join("", responseContent), actualResponseContent); }, async serverStream => { await serverStream.ReceiveAndSendAsync(headers: responseHeaders, content: string.Join("", responseContent)); }); }
public static IEnumerable <object[]> ChunkedData() { int testIdx = 0; foreach (TestHeadersSink headers in HeadersData()) { foreach (List <string> contents in ContentData()) { foreach (TestHeadersSink trailers in HeadersData()) { var trailersToSend = new TestHeadersSink(); foreach (var kvp in trailers) { trailersToSend.Add(kvp.Key + "-trailer", kvp.Value); } ++testIdx; yield return(new object[] { testIdx, headers, contents, trailersToSend }); } } } }
public async Task Receive_ChunkedResponse_Success(int testIdx, TestHeadersSink responseHeaders, List <string> responseContent, TestHeadersSink responseTrailingHeaders) { _ = testIdx; // only used to assist debugging. await RunSingleStreamTest( async (client, serverUri) => { client.ConfigureRequest(contentLength: 0, hasTrailingHeaders: false); client.WriteRequest(HttpMethod.Get, serverUri); client.WriteHeader("TE", "trailers"); await client.CompleteRequestAsync(); Assert.True(await client.ReadToFinalResponseAsync()); Version version = client.Version !; Assert.NotNull(version); TestHeadersSink headers = await client.ReadAllHeadersAsync(); if (version.Major == Version.Major) { Assert.Equal("chunked", headers.GetSingleValue("transfer-encoding")); } Assert.True(headers.Contains(responseHeaders)); string content = await client.ReadAllContentAsStringAsync(); Assert.Equal(string.Join("", responseContent), content); TestHeadersSink trailers = await client.ReadAllTrailingHeadersAsync(); Assert.True(trailers.Contains(responseTrailingHeaders)); }, async server => { await server.ReceiveAndSendChunkedAsync(headers: responseHeaders, content: responseContent, trailingHeaders: responseTrailingHeaders); }); }
public async Task Send_ChunkedRequest_Success(int testIdx, TestHeadersSink requestHeaders, List <string> requestContent, TestHeadersSink requestTrailingHeaders) { _ = testIdx; // only used to assist debugging. await RunSingleStreamTest( async (client, serverUri) => { long contentLength = requestContent.Sum(x => (long)x.Length); client.ConfigureRequest(contentLength, hasTrailingHeaders: true); client.WriteRequest(HttpMethod.Post, serverUri); client.WriteHeader("Content-Length", contentLength.ToString(CultureInfo.InvariantCulture)); client.WriteHeaders(requestHeaders); foreach (string content in requestContent) { await client.WriteContentAsync(content); } client.WriteTrailingHeaders(requestTrailingHeaders); await client.CompleteRequestAsync(); }, async server => { HttpTestFullRequest request = await server.ReceiveAndSendAsync(); if (request.Version.Major == 1) { Assert.Equal("chunked", request.Headers.GetSingleValue("transfer-encoding")); } Assert.True(request.Headers.Contains(requestHeaders)); Assert.Equal(string.Join("", requestContent), request.Content); Assert.True(request.TrailingHeaders.Contains(requestTrailingHeaders)); }); }
public async Task Pipelining_Success() { const int PipelineLength = 10; await RunMultiStreamTest( async (client, serverUri) => { var tasks = new Task[PipelineLength]; for (int i = 0; i < tasks.Length; ++i) { tasks[i] = MakeRequest(i); } if (Debugger.IsAttached) { await tasks.WhenAllOrAnyFailed(); } else { await tasks.WhenAllOrAnyFailed(DefaultTestTimeout * 5); } async Task MakeRequest(int requestNo) { await using ValueHttpRequest request = (await client.CreateNewRequestAsync(Version, HttpVersionPolicy.RequestVersionExact)).Value; request.ConfigureRequest(contentLength: 0, hasTrailingHeaders: false); request.WriteRequest(HttpMethod.Get, serverUri); request.WriteHeader("X-Request-No", requestNo.ToString(CultureInfo.InvariantCulture)); await request.CompleteRequestAsync(); TestHeadersSink headers = await request.ReadAllHeadersAsync(); Assert.Equal(requestNo.ToString(CultureInfo.InvariantCulture), headers.GetSingleValue("X-Response-No")); } }, async server => { var streams = new (HttpTestStream, HttpTestFullRequest)[PipelineLength]; for (int i = 0; i < streams.Length; ++i) { HttpTestStream stream = await server.AcceptStreamAsync(); HttpTestFullRequest request = await stream.ReceiveFullRequestAsync(); Assert.Equal(i.ToString(CultureInfo.InvariantCulture), request.Headers.GetSingleValue("X-Request-No")); streams[i] = (stream, request); } for (int i = 0; i < streams.Length; ++i) { (HttpTestStream stream, HttpTestFullRequest request) = streams[i]; var responseHeaders = new TestHeadersSink() { { "X-Response-No", i.ToString(CultureInfo.InvariantCulture) } }; await stream.SendResponseAsync(headers: responseHeaders); await stream.DisposeAsync(); } }, millisecondsTimeout : DefaultTestTimeout * 10);
private async Task ClientSendHelperAsync(ValueHttpRequest client, Uri serverUri, int testIdx, TestHeadersSink requestHeaders, List <string> requestContent, TestHeadersSink?requestTrailingHeaders) { long contentLength = requestContent.Sum(x => (long)x.Length); client.ConfigureRequest(contentLength, hasTrailingHeaders: requestTrailingHeaders != null); client.WriteRequest(HttpMethod.Post, serverUri); client.WriteHeader("Content-Length", contentLength.ToString(CultureInfo.InvariantCulture)); client.WriteHeader("Test-Index", testIdx.ToString(CultureInfo.InvariantCulture)); client.WriteHeaders(requestHeaders); foreach (string content in requestContent) { await client.WriteContentAsync(content); } if (requestTrailingHeaders != null) { client.WriteTrailingHeaders(requestTrailingHeaders); } await client.CompleteRequestAsync(); }