Write async chunks async

This commit is contained in:
Ben Adams 2016-01-16 23:57:59 +00:00
parent 9885377148
commit d3d9c8d546
1 changed files with 21 additions and 16 deletions

View File

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