diff --git a/src/Microsoft.AspNet.Server.Kestrel/Http/FrameOfT.cs b/src/Microsoft.AspNet.Server.Kestrel/Http/FrameOfT.cs index 9e932e2380..d9afe93d92 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Http/FrameOfT.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Http/FrameOfT.cs @@ -91,6 +91,9 @@ namespace Microsoft.AspNet.Server.Kestrel.Http await FireOnStarting(); } + _requestBody.PauseAcceptingReads(); + _responseBody.PauseAcceptingWrites(); + if (_onCompleted != null) { await FireOnCompleted(); @@ -101,10 +104,12 @@ namespace Microsoft.AspNet.Server.Kestrel.Http // If _requestAbort is set, the connection has already been closed. if (!_requestAborted) { + _responseBody.ResumeAcceptingWrites(); await ProduceEnd(); if (_keepAlive) { + _requestBody.ResumeAcceptingReads(); // Finish reading the request body in case the app did not. await messageBody.Consume(); } diff --git a/src/Microsoft.AspNet.Server.Kestrel/Http/FrameRequestStream.cs b/src/Microsoft.AspNet.Server.Kestrel/Http/FrameRequestStream.cs index c008d7cfc5..0c8ea64e81 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Http/FrameRequestStream.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Http/FrameRequestStream.cs @@ -123,6 +123,19 @@ namespace Microsoft.AspNet.Server.Kestrel.Http return this; } + public void PauseAcceptingReads() + { + _state = StreamState.Closed; + } + + public void ResumeAcceptingReads() + { + if (_state == StreamState.Closed) + { + _state = StreamState.Open; + } + } + public void StopAcceptingReads() { // Can't use dispose (or close) as can be disposed too early by user code diff --git a/src/Microsoft.AspNet.Server.Kestrel/Http/FrameResponseStream.cs b/src/Microsoft.AspNet.Server.Kestrel/Http/FrameResponseStream.cs index 832a112274..9d0658f89b 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Http/FrameResponseStream.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Http/FrameResponseStream.cs @@ -89,6 +89,19 @@ namespace Microsoft.AspNet.Server.Kestrel.Http return this; } + public void PauseAcceptingWrites() + { + _state = StreamState.Closed; + } + + public void ResumeAcceptingWrites() + { + if (_state == StreamState.Closed) + { + _state = StreamState.Open; + } + } + public void StopAcceptingWrites() { // Can't use dispose (or close) as can be disposed too early by user code