From ca263406b47a6e0bfe8d550fb7f870518c40c9a6 Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Thu, 26 Sep 2024 08:17:36 +0800 Subject: [PATCH 1/2] Quarantine Http1Connection_ServerAbort_HasErrorType --- .../test/InMemory.FunctionalTests/KestrelMetricsTests.cs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/Servers/Kestrel/test/InMemory.FunctionalTests/KestrelMetricsTests.cs b/src/Servers/Kestrel/test/InMemory.FunctionalTests/KestrelMetricsTests.cs index c1b3fde0f65f..8864558c717f 100644 --- a/src/Servers/Kestrel/test/InMemory.FunctionalTests/KestrelMetricsTests.cs +++ b/src/Servers/Kestrel/test/InMemory.FunctionalTests/KestrelMetricsTests.cs @@ -391,6 +391,7 @@ await connection.ReceiveEnd( } [Fact] + [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/58086")] public async Task Http1Connection_ServerAbort_HasErrorType() { var testMeterFactory = new TestMeterFactory(); @@ -399,17 +400,21 @@ public async Task Http1Connection_ServerAbort_HasErrorType() var serviceContext = new TestServiceContext(LoggerFactory, metrics: new KestrelMetrics(testMeterFactory)); var sendString = "POST / HTTP/1.0\r\nContent-Length: 12\r\n\r\nHello World?"; + var readBodyTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); - await using var server = new TestServer(c => + await using var server = new TestServer(async c => { + await c.Request.Body.ReadUntilEndAsync(); + readBodyTcs.SetResult(); c.Abort(); - return Task.CompletedTask; }, serviceContext); using (var connection = server.CreateConnection()) { await connection.Send(sendString).DefaultTimeout(); + await readBodyTcs.Task.DefaultTimeout(); + await connection.ReceiveEnd().DefaultTimeout(); await connection.WaitForConnectionClose().DefaultTimeout(); From 10d4c4935d9e498995f5790a7574ec441957b868 Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Thu, 26 Sep 2024 08:25:43 +0800 Subject: [PATCH 2/2] Clean up --- .../InMemory.FunctionalTests/KestrelMetricsTests.cs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/Servers/Kestrel/test/InMemory.FunctionalTests/KestrelMetricsTests.cs b/src/Servers/Kestrel/test/InMemory.FunctionalTests/KestrelMetricsTests.cs index 8864558c717f..311996794b20 100644 --- a/src/Servers/Kestrel/test/InMemory.FunctionalTests/KestrelMetricsTests.cs +++ b/src/Servers/Kestrel/test/InMemory.FunctionalTests/KestrelMetricsTests.cs @@ -400,12 +400,16 @@ public async Task Http1Connection_ServerAbort_HasErrorType() var serviceContext = new TestServiceContext(LoggerFactory, metrics: new KestrelMetrics(testMeterFactory)); var sendString = "POST / HTTP/1.0\r\nContent-Length: 12\r\n\r\nHello World?"; - var readBodyTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + var finishedSendingTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); await using var server = new TestServer(async c => { await c.Request.Body.ReadUntilEndAsync(); - readBodyTcs.SetResult(); + + // An extra check to ensure that client is done sending before the server aborts. + // This might not be necessary since we're reading to the end of the request body, but it doesn't hurt. + await finishedSendingTcs.Task; + c.Abort(); }, serviceContext); @@ -413,7 +417,7 @@ public async Task Http1Connection_ServerAbort_HasErrorType() { await connection.Send(sendString).DefaultTimeout(); - await readBodyTcs.Task.DefaultTimeout(); + finishedSendingTcs.SetResult(); await connection.ReceiveEnd().DefaultTimeout();