From ee8d8439ddae7c7817e0296a94c7b4e3bce123f9 Mon Sep 17 00:00:00 2001 From: Justin Kotalik Date: Fri, 21 Feb 2020 16:16:44 -0800 Subject: [PATCH] Fix HttpResponseStreamWriter (#19216) --- .../src/HttpResponseStreamWriter.cs | 32 ++++++++----------- .../test/HttpResponseStreamWriterTest.cs | 6 ++++ 2 files changed, 20 insertions(+), 18 deletions(-) diff --git a/src/Http/WebUtilities/src/HttpResponseStreamWriter.cs b/src/Http/WebUtilities/src/HttpResponseStreamWriter.cs index 4f16231e14..61e42d8bc3 100644 --- a/src/Http/WebUtilities/src/HttpResponseStreamWriter.cs +++ b/src/Http/WebUtilities/src/HttpResponseStreamWriter.cs @@ -135,20 +135,18 @@ namespace Microsoft.AspNetCore.WebUtilities throw new ObjectDisposedException(nameof(HttpResponseStreamWriter)); } - var written = 0; - while (written < value.Length) + var remaining = value.Length; + while (remaining > 0) { if (_charBufferCount == _charBufferSize) { FlushInternal(flushEncoder: false); } - written = CopyToCharBuffer(value); - - if (written < value.Length) - { - value = value.Slice(written); - } + var written = CopyToCharBuffer(value); + + remaining -= written; + value = value.Slice(written); }; } @@ -339,20 +337,18 @@ namespace Microsoft.AspNetCore.WebUtilities Debug.Assert(value.Length > 0); Debug.Assert(_charBufferSize - _charBufferCount < value.Length); - int written = 0; - while (written < value.Length) + var remaining = value.Length; + while (remaining > 0) { if (_charBufferCount == _charBufferSize) { await FlushInternalAsync(flushEncoder: false); } - written = CopyToCharBuffer(value.Span); - - if (written < value.Length) - { - value = value.Slice(written); - } + var written = CopyToCharBuffer(value.Span); + + remaining -= written; + value = value.Slice(written); }; } @@ -389,8 +385,8 @@ namespace Microsoft.AspNetCore.WebUtilities private async Task WriteLineAsyncAwaited(ReadOnlyMemory value) { - await WriteAsyncAwaited(value); - await WriteAsyncAwaited(NewLine); + await WriteAsync(value); + await WriteAsync(NewLine); } // We want to flush the stream when Flush/FlushAsync is explicitly diff --git a/src/Http/WebUtilities/test/HttpResponseStreamWriterTest.cs b/src/Http/WebUtilities/test/HttpResponseStreamWriterTest.cs index 61437e0bdb..aa97667360 100644 --- a/src/Http/WebUtilities/test/HttpResponseStreamWriterTest.cs +++ b/src/Http/WebUtilities/test/HttpResponseStreamWriterTest.cs @@ -258,6 +258,7 @@ namespace Microsoft.AspNetCore.WebUtilities [InlineData(1024)] [InlineData(1050)] [InlineData(2048)] + [InlineData(HttpResponseStreamWriter.DefaultBufferSize + 1)] public void WriteReadOnlySpanChar_WritesToStream(int byteLength) { // Arrange @@ -290,6 +291,7 @@ namespace Microsoft.AspNetCore.WebUtilities [InlineData(1050, "\r\n")] [InlineData(2046, "\r\n")] [InlineData(2048, "\r\n")] + [InlineData(HttpResponseStreamWriter.DefaultBufferSize + 1, "\r\n")] public void WriteLineReadOnlySpanChar_WritesToStream(int byteLength, string newLine) { // Arrange @@ -360,6 +362,7 @@ namespace Microsoft.AspNetCore.WebUtilities [InlineData(1024)] [InlineData(1050)] [InlineData(2048)] + [InlineData(HttpResponseStreamWriter.DefaultBufferSize + 1)] public async Task WriteReadOnlyMemoryAsync_WritesToStream(int byteLength) { // Arrange @@ -412,6 +415,9 @@ namespace Microsoft.AspNetCore.WebUtilities [InlineData(1050, 2)] [InlineData(2046, 2)] [InlineData(2048, 2)] + [InlineData(HttpResponseStreamWriter.DefaultBufferSize + 1, 1)] + [InlineData(HttpResponseStreamWriter.DefaultBufferSize + 1, 2)] + [InlineData(HttpResponseStreamWriter.DefaultBufferSize + 1, HttpResponseStreamWriter.DefaultBufferSize)] public async Task WriteLineReadOnlyMemoryAsync_WritesToStream(int byteLength, int newLineLength) { // Arrange