Skip to content

Commit 6a2f28e

Browse files
committed
Revert "Fix TestServer hang with duplex streaming requests (#17158)"
This reverts commit 34294a3.
1 parent df110a3 commit 6a2f28e

File tree

2 files changed

+13
-53
lines changed

2 files changed

+13
-53
lines changed

src/Hosting/TestHost/src/HttpContextBuilder.cs

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -110,10 +110,8 @@ async Task RunRequestAsync()
110110
try
111111
{
112112
await _application.ProcessRequestAsync(_testContext);
113-
114-
// Matches Kestrel server: response is completed before request is drained
115-
await CompleteResponseAsync();
116113
await CompleteRequestAsync();
114+
await CompleteResponseAsync();
117115
_application.DisposeContext(_testContext, exception: null);
118116
}
119117
catch (Exception ex)
@@ -173,9 +171,18 @@ private async Task CompleteRequestAsync()
173171
await _requestPipe.Reader.CompleteAsync();
174172
}
175173

176-
// Don't wait for request to drain. It could block indefinitely. In a real server
177-
// we would wait for a timeout and then kill the socket.
178-
// Potential future improvement: add logging that the request timed out
174+
if (_sendRequestStreamTask != null)
175+
{
176+
try
177+
{
178+
// Ensure duplex request is either completely read or has been aborted.
179+
await _sendRequestStreamTask;
180+
}
181+
catch (OperationCanceledException)
182+
{
183+
// Request was canceled, likely because it wasn't read before the request ended.
184+
}
185+
}
179186
}
180187

181188
internal async Task CompleteResponseAsync()

src/Hosting/TestHost/test/TestClientTests.cs

Lines changed: 0 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -384,53 +384,6 @@ public async Task ClientStreaming_ResponseCompletesWithoutReadingRequest()
384384
await writeTask;
385385
}
386386

387-
[Fact]
388-
public async Task ClientStreaming_ResponseCompletesWithoutResponseBodyWrite()
389-
{
390-
// Arrange
391-
var requestStreamTcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
392-
393-
RequestDelegate appDelegate = ctx =>
394-
{
395-
ctx.Response.Headers["test-header"] = "true";
396-
return Task.CompletedTask;
397-
};
398-
399-
Stream requestStream = null;
400-
401-
var builder = new WebHostBuilder().Configure(app => app.Run(appDelegate));
402-
var server = new TestServer(builder);
403-
var client = server.CreateClient();
404-
405-
var httpRequest = new HttpRequestMessage(HttpMethod.Post, "http://localhost:12345");
406-
httpRequest.Version = new Version(2, 0);
407-
httpRequest.Content = new PushContent(async stream =>
408-
{
409-
requestStream = stream;
410-
await requestStreamTcs.Task;
411-
});
412-
413-
// Act
414-
var response = await client.SendAsync(httpRequest, HttpCompletionOption.ResponseHeadersRead).WithTimeout();
415-
416-
var responseContent = await response.Content.ReadAsStreamAsync().WithTimeout();
417-
418-
// Assert
419-
response.EnsureSuccessStatusCode();
420-
Assert.Equal("true", response.Headers.GetValues("test-header").Single());
421-
422-
// Read response
423-
byte[] buffer = new byte[1024];
424-
var length = await responseContent.ReadAsync(buffer).AsTask().WithTimeout();
425-
Assert.Equal(0, length);
426-
427-
// Writing to request stream will fail because server is complete
428-
await Assert.ThrowsAnyAsync<Exception>(() => requestStream.WriteAsync(buffer).AsTask());
429-
430-
// Unblock request
431-
requestStreamTcs.TrySetResult(null);
432-
}
433-
434387
[Fact]
435388
public async Task ClientStreaming_ServerAbort()
436389
{

0 commit comments

Comments
 (0)