From 4bba074d778933b312011df0ade8ff875250cded Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Wed, 28 Oct 2015 08:53:11 +0000 Subject: [PATCH 1/3] Read to null buffer Read to null buffer rather than Stream.Null as the CopyToAsync will create a `new byte[]` on each call https://github.com/dotnet/coreclr/blob/bc146608854d1db9cdbcc0b08029a87754e12b49/src/mscorlib/src/System/IO/Stream.cs#L218 of size 81920 bytes! https://github.com/dotnet/coreclr/blob/bc146608854d1db9cdbcc0b08029a87754e12b49/src/mscorlib/src/System/IO/Stream.cs#L48 --- src/Microsoft.AspNet.Server.Kestrel/Http/Frame.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Server.Kestrel/Http/Frame.cs b/src/Microsoft.AspNet.Server.Kestrel/Http/Frame.cs index 13546271e5..5b7678e48f 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Http/Frame.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Http/Frame.cs @@ -29,6 +29,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http private readonly object _onStartingSync = new Object(); private readonly object _onCompletedSync = new Object(); private readonly FrameRequestHeaders _requestHeaders = new FrameRequestHeaders(); + private readonly byte[] _nullBuffer = new byte[4096]; private readonly FrameResponseHeaders _responseHeaders = new FrameResponseHeaders(); private List, object>> _onStarting; @@ -198,7 +199,10 @@ namespace Microsoft.AspNet.Server.Kestrel.Http await ProduceEnd(); // Finish reading the request body in case the app did not. - await RequestBody.CopyToAsync(Stream.Null); + while (await RequestBody.ReadAsync(_nullBuffer, 0, _nullBuffer.Length) != 0) + { + ; + } } terminated = !_keepAlive; From bdadc8a3dace276ecb1a65d4ea49caafa7c97fb3 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Wed, 28 Oct 2015 22:44:35 +0000 Subject: [PATCH 2/3] Move comment into loop, remove noop --- src/Microsoft.AspNet.Server.Kestrel/Http/Frame.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Server.Kestrel/Http/Frame.cs b/src/Microsoft.AspNet.Server.Kestrel/Http/Frame.cs index 5b7678e48f..8f1c804926 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Http/Frame.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Http/Frame.cs @@ -198,10 +198,9 @@ namespace Microsoft.AspNet.Server.Kestrel.Http await ProduceEnd(); - // Finish reading the request body in case the app did not. while (await RequestBody.ReadAsync(_nullBuffer, 0, _nullBuffer.Length) != 0) { - ; + // Finish reading the request body in case the app did not. } } From 1722150ee99999079e5d7c7d4565102e25e617a2 Mon Sep 17 00:00:00 2001 From: Stephen Halter Date: Wed, 28 Oct 2015 16:18:51 -0700 Subject: [PATCH 3/3] Do nothing in KestrelThread.Stop if libuv fails to load This prevents DllNotFoundExceptions from being masked by NullReferenceExceptions --- .../Infrastructure/KestrelThread.cs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/KestrelThread.cs b/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/KestrelThread.cs index 6c26ec71b1..85a4b50621 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/KestrelThread.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/KestrelThread.cs @@ -30,6 +30,7 @@ namespace Microsoft.AspNet.Server.Kestrel private Queue _closeHandleRunning = new Queue(); private object _workSync = new Object(); private bool _stopImmediate = false; + private bool _initCompleted = false; private ExceptionDispatchInfo _closeError; private IKestrelTrace _log; @@ -58,6 +59,11 @@ namespace Microsoft.AspNet.Server.Kestrel public void Stop(TimeSpan timeout) { + if (!_initCompleted) + { + return; + } + Post(OnStop, null); if (!_thread.Join((int)timeout.TotalMilliseconds)) { @@ -195,8 +201,11 @@ namespace Microsoft.AspNet.Server.Kestrel catch (Exception ex) { tcs.SetException(ex); + return; } + _initCompleted = true; + try { var ran1 = _loop.Run();