public async Task AfterReadResponseServerError_ClientRead() { TaskCompletionSource <Stream> requestStreamTcs = new TaskCompletionSource <Stream>(TaskCreationOptions.RunContinuationsAsynchronously); TaskCompletionSource <object> completeStreamTcs = new TaskCompletionSource <object>(TaskCreationOptions.RunContinuationsAsynchronously); using (Http2LoopbackServer server = Http2LoopbackServer.CreateServer()) using (HttpClient client = CreateHttpClient()) { HttpRequestMessage message = new HttpRequestMessage(HttpMethod.Post, server.Address); message.Version = new Version(2, 0); message.Content = new StreamingContent(async s => { requestStreamTcs.SetResult(s); await completeStreamTcs.Task; }); Task <HttpResponseMessage> sendTask = client.SendAsync(message, HttpCompletionOption.ResponseHeadersRead); Http2LoopbackConnection connection = await server.EstablishConnectionAsync(); Stream requestStream = await requestStreamTcs.Task; await requestStream.WriteAsync(new byte[50]); int streamId = await connection.ReadRequestHeaderAsync(expectEndOfStream : false); Frame frame = await connection.ReadDataFrameAsync(); // Response header. await connection.SendDefaultResponseHeadersAsync(streamId); // Response data. await connection.WriteFrameAsync(MakeDataFrame(streamId, DataBytes, endStream : false)); HttpResponseMessage response = await sendTask; Assert.Equal(HttpStatusCode.OK, response.StatusCode); Stream responseStream = await response.Content.ReadAsStreamAsync(); // Read response data. byte[] buffer = new byte[1024]; int readCount = await responseStream.ReadAsync(buffer, 0, buffer.Length); Assert.Equal(DataBytes.Length, readCount); // Server sends RST_STREAM. await connection.WriteFrameAsync(new RstStreamFrame(FrameFlags.EndStream, 0, streamId)); await Assert.ThrowsAsync <IOException>(() => responseStream.ReadAsync(buffer, 0, buffer.Length)); } }
public async Task WriteRequestAfterReadResponse() { TaskCompletionSource <object> tcs = new TaskCompletionSource <object>(TaskCreationOptions.RunContinuationsAsynchronously); using (Http2LoopbackServer server = Http2LoopbackServer.CreateServer()) using (HttpClient client = CreateHttpClient()) { HttpRequestMessage message = new HttpRequestMessage(HttpMethod.Post, server.Address); message.Version = new Version(2, 0); message.Content = new StreamingContent(async s => { await s.WriteAsync(new byte[50]); await tcs.Task; await s.WriteAsync(new byte[50]); }, length: null); Task <HttpResponseMessage> sendTask = client.SendAsync(message, HttpCompletionOption.ResponseHeadersRead); Http2LoopbackConnection connection = await server.EstablishConnectionAsync(); int streamId = await connection.ReadRequestHeaderAsync(expectEndOfStream : false); Frame frame = await connection.ReadDataFrameAsync(); // Response header. await connection.SendDefaultResponseHeadersAsync(streamId); // Response data. await connection.WriteFrameAsync(MakeDataFrame(streamId, DataBytes, endStream : false)); HttpResponseMessage response = await sendTask; Assert.Equal(HttpStatusCode.OK, response.StatusCode); using Stream responseStream = await response.Content.ReadAsStreamAsync(); // Read response data. byte[] buffer = new byte[1024]; int readCount = await responseStream.ReadAsync(buffer, 0, buffer.Length); Assert.Equal(DataBytes.Length, readCount); // Finish sending request data. tcs.SetResult(null); frame = await connection.ReadDataFrameAsync(); // Response data. await connection.WriteFrameAsync(MakeDataFrame(streamId, DataBytes, endStream : true)); // Finish reading response data. readCount = await responseStream.ReadAsync(buffer, 0, buffer.Length); Assert.Equal(DataBytes.Length, readCount); readCount = await responseStream.ReadAsync(buffer, 0, buffer.Length); Assert.Equal(0, readCount); } }