diff --git a/src/Microsoft.AspNet.Server.Kestrel/Filter/FilteredStreamAdapter.cs b/src/Microsoft.AspNet.Server.Kestrel/Filter/FilteredStreamAdapter.cs index 598620d1e6..beb5c3b803 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Filter/FilteredStreamAdapter.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Filter/FilteredStreamAdapter.cs @@ -28,9 +28,13 @@ namespace Microsoft.AspNet.Server.Kestrel.Filter _filteredStream = filteredStream; _socketInputStream = new SocketInputStream(SocketInput); - // Don't use 81920 byte buffer - _filteredStream.CopyToAsync(_socketInputStream, 4096).ContinueWith((task, state) => + var block = memory.Lease(); + // Use pooled block for copy + _filteredStream.CopyToAsync(_socketInputStream, block).ContinueWith((task, state) => { + var returnedBlock = task.Result; + returnedBlock.Pool?.Return(returnedBlock); + ((FilteredStreamAdapter)state).OnStreamClose(task); }, this); } diff --git a/src/Microsoft.AspNet.Server.Kestrel/Filter/StreamExtensions.cs b/src/Microsoft.AspNet.Server.Kestrel/Filter/StreamExtensions.cs new file mode 100644 index 0000000000..af3e77d15f --- /dev/null +++ b/src/Microsoft.AspNet.Server.Kestrel/Filter/StreamExtensions.cs @@ -0,0 +1,23 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.IO; +using System.Threading.Tasks; +using Microsoft.AspNet.Server.Kestrel.Infrastructure; + +namespace Microsoft.AspNet.Server.Kestrel.Filter +{ + public static class StreamExtensions + { + public static async Task CopyToAsync(this Stream source, Stream destination, MemoryPoolBlock2 block) + { + int bytesRead; + while ((bytesRead = await source.ReadAsync(block.Array, block.Data.Offset, block.Data.Count)) != 0) + { + await destination.WriteAsync(block.Array, block.Data.Offset, bytesRead); + } + + return block; + } + } +}