diff --git a/src/Microsoft.AspNetCore.Server.Kestrel/Http/MessageBody.cs b/src/Microsoft.AspNetCore.Server.Kestrel/Http/MessageBody.cs index daeeeaa9e1..2731ec42a6 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel/Http/MessageBody.cs +++ b/src/Microsoft.AspNetCore.Server.Kestrel/Http/MessageBody.cs @@ -5,6 +5,7 @@ using System; using System.IO; using System.Threading; using System.Threading.Tasks; +using Microsoft.AspNetCore.Server.Kestrel.Infrastructure; namespace Microsoft.AspNetCore.Server.Kestrel.Http { @@ -35,7 +36,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Http return result; } - public async Task Consume(CancellationToken cancellationToken = default(CancellationToken)) + public Task Consume(CancellationToken cancellationToken = default(CancellationToken)) { ValueTask result; var send100checked = false; @@ -52,17 +53,43 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Http } send100checked = true; } + // Incomplete Task await result + return ConsumeAwaited(result.AsTask(), cancellationToken); } // ValueTask uses .GetAwaiter().GetResult() if necessary else if (result.Result == 0) { // Completed Task, end of stream - return; + return TaskUtilities.CompletedTask; } - else + + } while (true); + } + + private async Task ConsumeAwaited(Task currentTask, CancellationToken cancellationToken) + { + if (await currentTask == 0) + { + return; + } + + ValueTask result; + do + { + result = ReadAsyncImplementation(default(ArraySegment), cancellationToken); + if (result.IsCompleted) { - // Completed Task, get next Task rather than await - continue; + // ValueTask uses .GetAwaiter().GetResult() if necessary + if (result.Result == 0) + { + // Completed Task, end of stream + return; + } + else + { + // Completed Task, get next Task rather than await + continue; + } } } while (await result != 0); }