Cancel previous request on close (#2923)

This commit is contained in:
BrennanConroy 2018-09-10 15:09:05 -07:00 committed by GitHub
parent 753c3da852
commit 399ac267ca
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 15 additions and 2 deletions

View File

@ -215,8 +215,18 @@ namespace Microsoft.AspNetCore.Http.Connections.Internal
// Cancel the previous request // Cancel the previous request
connection.Cancellation?.Cancel(); connection.Cancellation?.Cancel();
// Wait for the previous request to drain try
await connection.PreviousPollTask; {
// 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; connection.PreviousPollTask = currentRequestTcs.Task;
} }
@ -286,6 +296,9 @@ namespace Microsoft.AspNetCore.Http.Connections.Internal
// If the status code is a 204 it means the connection is done // If the status code is a 204 it means the connection is done
if (context.Response.StatusCode == StatusCodes.Status204NoContent) 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 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 // We don't need to wait for close here since we've already waited for both sides
await _manager.DisposeAndRemoveAsync(connection, closeGracefully: false); await _manager.DisposeAndRemoveAsync(connection, closeGracefully: false);