diff --git a/src/Microsoft.AspNet.Server.Kestrel/Http/Frame.cs b/src/Microsoft.AspNet.Server.Kestrel/Http/Frame.cs index f315bb702b..54cc69855f 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Http/Frame.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Http/Frame.cs @@ -421,7 +421,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http { return; } - WriteChunked(data); + WriteChunkedAsync(data, RequestAborted).GetAwaiter().GetResult(); } else { @@ -468,19 +468,14 @@ namespace Microsoft.AspNet.Server.Kestrel.Http } } - private void WriteChunked(ArraySegment data) + private Task WriteChunkedAsync(ArraySegment data, CancellationToken cancellationToken) { - SocketOutput.Write(data, immediate: false, chunk: true); + return SocketOutput.WriteAsync(data, immediate: false, chunk: true, cancellationToken: cancellationToken); } - private async Task WriteChunkedAsync(ArraySegment data, CancellationToken cancellationToken) + private Task WriteChunkedResponseSuffix() { - await SocketOutput.WriteAsync(data, immediate: false, chunk: true, cancellationToken: cancellationToken); - } - - private void WriteChunkedResponseSuffix() - { - SocketOutput.Write(_endChunkedResponseBytes, immediate: true); + return SocketOutput.WriteAsync(_endChunkedResponseBytes, immediate: true); } private static ArraySegment CreateAsciiByteArraySegment(string text) @@ -571,31 +566,41 @@ namespace Microsoft.AspNet.Server.Kestrel.Http return ProduceEndAwaited(); } - WriteSuffix(); - - return TaskUtilities.CompletedTask; + return WriteSuffix(); } private async Task ProduceEndAwaited() { await ProduceStart(immediate: true, appCompleted: true); - WriteSuffix(); + await WriteSuffix(); } - private void WriteSuffix() + private Task WriteSuffix() { // _autoChunk should be checked after we are sure ProduceStart() has been called // since ProduceStart() may set _autoChunk to true. if (_autoChunk) { - WriteChunkedResponseSuffix(); + return WriteAutoChunkSuffixAwaited(); } if (_keepAlive) { ConnectionControl.End(ProduceEndType.ConnectionKeepAlive); } + + return TaskUtilities.CompletedTask; + } + + private async Task WriteAutoChunkSuffixAwaited() + { + await WriteChunkedResponseSuffix(); + + if (_keepAlive) + { + ConnectionControl.End(ProduceEndType.ConnectionKeepAlive); + } } private Task CreateResponseHeader(