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;
}
WriteChunked(data);
WriteChunkedAsync(data, RequestAborted).GetAwaiter().GetResult();
}
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);
}
private void WriteChunkedResponseSuffix()
{
SocketOutput.Write(_endChunkedResponseBytes, immediate: true);
return SocketOutput.WriteAsync(_endChunkedResponseBytes, immediate: true);
}
private static ArraySegment<byte> 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(