Cancel previous request on close (#2923) (#2942)

This commit is contained in:
BrennanConroy 2018-09-11 15:50:00 -07:00 committed by GitHub
parent 015a8c1461
commit 8dffc68cea
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 18 additions and 2 deletions

View File

@ -218,8 +218,18 @@ namespace Microsoft.AspNetCore.Http.Connections.Internal
// Cancel the previous request
connection.Cancellation?.Cancel();
// Always wait for the previous request to drain
await connection.PreviousPollTask;
try
{
// Wait for the previous request to drain
await connection.PreviousPollTask;
}
catch (OperationCanceledException)
{
// Previous poll canceled due to connection closing, close this poll too
context.Response.ContentType = "text/plain";
context.Response.StatusCode = StatusCodes.Status204NoContent;
return;
}
connection.PreviousPollTask = currentRequestTcs.Task;
}
@ -289,6 +299,9 @@ namespace Microsoft.AspNetCore.Http.Connections.Internal
// If the status code is a 204 it means the connection is done
if (context.Response.StatusCode == StatusCodes.Status204NoContent)
{
// Cancel current request to release any waiting poll and let dispose aquire the lock
currentRequestTcs.TrySetCanceled();
// We should be able to safely dispose because there's no more data being written
// We don't need to wait for close here since we've already waited for both sides
await _manager.DisposeAndRemoveAsync(connection, closeGracefully: false);
@ -299,6 +312,9 @@ namespace Microsoft.AspNetCore.Http.Connections.Internal
}
else if (resultTask.IsFaulted)
{
// Cancel current request to release any waiting poll and let dispose aquire the lock
currentRequestTcs.TrySetCanceled();
// transport task was faulted, we should remove the connection
await _manager.DisposeAndRemoveAsync(connection, closeGracefully: false);