diff --git a/src/Microsoft.AspNet.Server.Kestrel/Http/Frame.cs b/src/Microsoft.AspNet.Server.Kestrel/Http/Frame.cs index e445bc815..054784c42 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Http/Frame.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Http/Frame.cs @@ -263,28 +263,15 @@ public async Task RequestProcessingAsync() { try { - var terminated = false; - while (!terminated && !_requestProcessingStopping) + while (!_requestProcessingStopping) { - while (!terminated && !_requestProcessingStopping && !TakeStartLine(SocketInput)) + if (!await ReadStartLineAsync() || + !await ReadHeadersAsync()) { - terminated = SocketInput.RemoteIntakeFin; - if (!terminated) - { - await SocketInput; - } - } - - while (!terminated && !_requestProcessingStopping && !TakeMessageHeaders(SocketInput, _requestHeaders)) - { - terminated = SocketInput.RemoteIntakeFin; - if (!terminated) - { - await SocketInput; - } + break; } - if (!terminated && !_requestProcessingStopping) + if (!_requestProcessingStopping) { var messageBody = MessageBody.For(HttpVersion, _requestHeaders, this); _keepAlive = messageBody.RequestKeepAlive; @@ -337,7 +324,10 @@ public async Task RequestProcessingAsync() _responseBody.StopAcceptingWrites(); } - terminated = !_keepAlive; + if (!_keepAlive) + { + break; + } } Reset(); @@ -372,6 +362,62 @@ public async Task RequestProcessingAsync() } } } + private Task ReadStartLineAsync() + { + if (!_requestProcessingStopping && !TakeStartLine(SocketInput)) + { + if (SocketInput.RemoteIntakeFin) + { + return TaskUtilities.CompletedFalseTask; + }; + return ReadStartLineAwaitAsync(); + } + return TaskUtilities.CompletedTrueTask; + } + + private async Task ReadStartLineAwaitAsync() + { + await SocketInput; + + while (!_requestProcessingStopping && !TakeStartLine(SocketInput)) + { + if (SocketInput.RemoteIntakeFin) + { + return false; + }; + + await SocketInput; + } + return true; + } + + private Task ReadHeadersAsync() + { + if (!_requestProcessingStopping && !TakeMessageHeaders(SocketInput, _requestHeaders)) + { + if (SocketInput.RemoteIntakeFin) + { + return TaskUtilities.CompletedFalseTask; + }; + return ReadHeadersAwaitAsync(); + } + return TaskUtilities.CompletedTrueTask; + } + + private async Task ReadHeadersAwaitAsync() + { + await SocketInput; + + while (!_requestProcessingStopping && !TakeMessageHeaders(SocketInput, _requestHeaders)) + { + if (SocketInput.RemoteIntakeFin) + { + return false; + }; + await SocketInput; + } + return true; + } public void OnStarting(Func callback, object state) { diff --git a/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/TaskUtilities.cs b/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/TaskUtilities.cs index e67ded5ac..426ab7a9e 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/TaskUtilities.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/TaskUtilities.cs @@ -12,5 +12,7 @@ public static class TaskUtilities #else public static Task CompletedTask = Task.FromResult(null); #endif + public static Task CompletedTrueTask = Task.FromResult(true); + public static Task CompletedFalseTask = Task.FromResult(false); } } \ No newline at end of file