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)