From 4c0413c8043b084362d473365765269ec0fd302b Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Thu, 22 Dec 2016 13:40:40 +0000 Subject: [PATCH] Implement Stream Flush+FlushAsync fully Streams should pass through the flush and not assume the underlying Stream's Flush behaviour --- .../Filter/Internal/LibuvStream.cs | 5 ++--- .../Filter/Internal/LoggingStream.cs | 5 +++++ .../Filter/Internal/StreamSocketOutput.cs | 4 ++-- .../ConnectionFilterTests.cs | 7 ++++++- 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.AspNetCore.Server.Kestrel/Filter/Internal/LibuvStream.cs b/src/Microsoft.AspNetCore.Server.Kestrel/Filter/Internal/LibuvStream.cs index b8bc766f94..da3bb43f7e 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel/Filter/Internal/LibuvStream.cs +++ b/src/Microsoft.AspNetCore.Server.Kestrel/Filter/Internal/LibuvStream.cs @@ -117,13 +117,12 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Filter.Internal public override void Flush() { - // No-op since writes are immediate. + _output.Flush(); } public override Task FlushAsync(CancellationToken cancellationToken) { - // No-op since writes are immediate. - return TaskCache.CompletedTask; + return _output.FlushAsync(cancellationToken); } private ValueTask ReadAsync(ArraySegment buffer) diff --git a/src/Microsoft.AspNetCore.Server.Kestrel/Filter/Internal/LoggingStream.cs b/src/Microsoft.AspNetCore.Server.Kestrel/Filter/Internal/LoggingStream.cs index 14890c0e3a..cb052fe2a0 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel/Filter/Internal/LoggingStream.cs +++ b/src/Microsoft.AspNetCore.Server.Kestrel/Filter/Internal/LoggingStream.cs @@ -71,6 +71,11 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Filter.Internal _inner.Flush(); } + public override Task FlushAsync(CancellationToken cancellationToken) + { + return _inner.FlushAsync(cancellationToken); + } + public override int Read(byte[] buffer, int offset, int count) { int read = _inner.Read(buffer, offset, count); diff --git a/src/Microsoft.AspNetCore.Server.Kestrel/Filter/Internal/StreamSocketOutput.cs b/src/Microsoft.AspNetCore.Server.Kestrel/Filter/Internal/StreamSocketOutput.cs index bce699f693..8d3bf6df70 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel/Filter/Internal/StreamSocketOutput.cs +++ b/src/Microsoft.AspNetCore.Server.Kestrel/Filter/Internal/StreamSocketOutput.cs @@ -114,14 +114,14 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Filter.Internal end.Block.Pool.Return(end.Block); } - // Flush no-ops. We rely on connection filter streams to auto-flush. public void Flush() { + _outputStream.Flush(); } public Task FlushAsync(CancellationToken cancellationToken) { - return TaskCache.CompletedTask; + return _outputStream.FlushAsync(cancellationToken); } } } diff --git a/test/Microsoft.AspNetCore.Server.KestrelTests/ConnectionFilterTests.cs b/test/Microsoft.AspNetCore.Server.KestrelTests/ConnectionFilterTests.cs index a27e8a40bd..a121d77180 100644 --- a/test/Microsoft.AspNetCore.Server.KestrelTests/ConnectionFilterTests.cs +++ b/test/Microsoft.AspNetCore.Server.KestrelTests/ConnectionFilterTests.cs @@ -160,7 +160,12 @@ namespace Microsoft.AspNetCore.Server.KestrelTests public override void Flush() { - // No-op + _innerStream.Flush(); + } + + public override Task FlushAsync(CancellationToken cancellationToken) + { + return _innerStream.FlushAsync(cancellationToken); } public override int Read(byte[] buffer, int offset, int count)