diff --git a/src/Http/WebUtilities/src/HttpResponseStreamWriter.cs b/src/Http/WebUtilities/src/HttpResponseStreamWriter.cs index 4f16231e1462..61e42d8bc3b7 100644 --- a/src/Http/WebUtilities/src/HttpResponseStreamWriter.cs +++ b/src/Http/WebUtilities/src/HttpResponseStreamWriter.cs @@ -135,20 +135,18 @@ public override void Write(ReadOnlySpan value) 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 @@ private async Task WriteAsyncAwaited(ReadOnlyMemory value) 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 @@ public override Task WriteLineAsync(ReadOnlyMemory value, CancellationToke 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 61437e0bdbc5..aa97667360f7 100644 --- a/src/Http/WebUtilities/test/HttpResponseStreamWriterTest.cs +++ b/src/Http/WebUtilities/test/HttpResponseStreamWriterTest.cs @@ -258,6 +258,7 @@ public void WriteCharArray_WritesToStream(int byteLength) [InlineData(1024)] [InlineData(1050)] [InlineData(2048)] + [InlineData(HttpResponseStreamWriter.DefaultBufferSize + 1)] public void WriteReadOnlySpanChar_WritesToStream(int byteLength) { // Arrange @@ -290,6 +291,7 @@ public void WriteReadOnlySpanChar_WritesToStream(int byteLength) [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 @@ public async Task WriteCharArrayAsync_WritesToStream(int byteLength) [InlineData(1024)] [InlineData(1050)] [InlineData(2048)] + [InlineData(HttpResponseStreamWriter.DefaultBufferSize + 1)] public async Task WriteReadOnlyMemoryAsync_WritesToStream(int byteLength) { // Arrange @@ -412,6 +415,9 @@ public async Task WriteReadOnlyMemoryAsync_TokenCanceled_ReturnsCanceledTask() [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