diff --git a/src/Microsoft.AspNetCore.Server.Kestrel/Filter/StreamSocketOutput.cs b/src/Microsoft.AspNetCore.Server.Kestrel/Filter/StreamSocketOutput.cs index f9ba1e42e..0fce7a476 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel/Filter/StreamSocketOutput.cs +++ b/src/Microsoft.AspNetCore.Server.Kestrel/Filter/StreamSocketOutput.cs @@ -73,9 +73,26 @@ public void Write(ArraySegment buffer, bool chunk) public Task WriteAsync(ArraySegment buffer, bool chunk, CancellationToken cancellationToken) { - // TODO: Use _outputStream.WriteAsync +#if NET451 Write(buffer, chunk); return TaskUtilities.CompletedTask; +#else + if (chunk && buffer.Array != null) + { + return WriteAsyncChunked(buffer, cancellationToken); + } + + return _outputStream.WriteAsync(buffer.Array ?? _nullBuffer, buffer.Offset, buffer.Count, cancellationToken); +#endif + } + + private async Task WriteAsyncChunked(ArraySegment buffer, CancellationToken cancellationToken) + { + var beginChunkBytes = ChunkWriter.BeginChunkBytes(buffer.Count); + + await _outputStream.WriteAsync(beginChunkBytes.Array, beginChunkBytes.Offset, beginChunkBytes.Count, cancellationToken); + await _outputStream.WriteAsync(buffer.Array, buffer.Offset, buffer.Count, cancellationToken); + await _outputStream.WriteAsync(_endChunkBytes, 0, _endChunkBytes.Length, cancellationToken); } public MemoryPoolIterator ProducingStart()