diff --git a/src/Microsoft.AspNetCore.Server.Kestrel.Core/Internal/Http/Frame.cs b/src/Microsoft.AspNetCore.Server.Kestrel.Core/Internal/Http/Frame.cs index 96abde3566..5ee289501e 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel.Core/Internal/Http/Frame.cs +++ b/src/Microsoft.AspNetCore.Server.Kestrel.Core/Internal/Http/Frame.cs @@ -503,64 +503,13 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http } } - public void Flush() - { - InitializeResponse(0).GetAwaiter().GetResult(); - Output.Flush(); - } - - public async Task FlushAsync(CancellationToken cancellationToken) + public async Task FlushAsync(CancellationToken cancellationToken = default(CancellationToken)) { await InitializeResponse(0); await Output.FlushAsync(cancellationToken); } - public void Write(ArraySegment data) - { - // For the first write, ensure headers are flushed if Write(Chunked) isn't called. - var firstWrite = !HasResponseStarted; - - if (firstWrite) - { - InitializeResponse(data.Count).GetAwaiter().GetResult(); - } - else - { - VerifyAndUpdateWrite(data.Count); - } - - if (_canHaveBody) - { - if (_autoChunk) - { - if (data.Count == 0) - { - if (firstWrite) - { - Flush(); - } - return; - } - WriteChunked(data); - } - else - { - CheckLastWrite(); - Output.Write(data); - } - } - else - { - HandleNonBodyResponseWrite(); - - if (firstWrite) - { - Flush(); - } - } - } - - public Task WriteAsync(ArraySegment data, CancellationToken cancellationToken) + public Task WriteAsync(ArraySegment data, CancellationToken cancellationToken = default(CancellationToken)) { if (!HasResponseStarted) { @@ -679,11 +628,6 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http } } - private void WriteChunked(ArraySegment data) - { - Output.Write(data, chunk: true); - } - private Task WriteChunkedAsync(ArraySegment data, CancellationToken cancellationToken) { return Output.WriteAsync(data, chunk: true, cancellationToken: cancellationToken); @@ -707,12 +651,11 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http return; } - StringValues expect; if (_httpVersion == Http.HttpVersion.Http11 && - RequestHeaders.TryGetValue("Expect", out expect) && + RequestHeaders.TryGetValue("Expect", out var expect) && (expect.FirstOrDefault() ?? "").Equals("100-continue", StringComparison.OrdinalIgnoreCase)) { - Output.Write(_continueBytes); + Output.WriteAsync(_continueBytes).GetAwaiter().GetResult(); } } diff --git a/src/Microsoft.AspNetCore.Server.Kestrel.Core/Internal/Http/FrameResponseStream.cs b/src/Microsoft.AspNetCore.Server.Kestrel.Core/Internal/Http/FrameResponseStream.cs index 23712d5cb4..062be560c2 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel.Core/Internal/Http/FrameResponseStream.cs +++ b/src/Microsoft.AspNetCore.Server.Kestrel.Core/Internal/Http/FrameResponseStream.cs @@ -33,9 +33,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http public override void Flush() { - ValidateState(default(CancellationToken)); - - _frameControl.Flush(); + FlushAsync(default(CancellationToken)).GetAwaiter().GetResult(); } public override Task FlushAsync(CancellationToken cancellationToken) @@ -60,9 +58,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http public override void Write(byte[] buffer, int offset, int count) { - ValidateState(default(CancellationToken)); - - _frameControl.Write(new ArraySegment(buffer, offset, count)); + WriteAsync(buffer, offset, count, default(CancellationToken)).GetAwaiter().GetResult(); } public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state) diff --git a/src/Microsoft.AspNetCore.Server.Kestrel.Core/Internal/Http/IFrameControl.cs b/src/Microsoft.AspNetCore.Server.Kestrel.Core/Internal/Http/IFrameControl.cs index 5ad87bc264..eed8069276 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel.Core/Internal/Http/IFrameControl.cs +++ b/src/Microsoft.AspNetCore.Server.Kestrel.Core/Internal/Http/IFrameControl.cs @@ -10,9 +10,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http public interface IFrameControl { void ProduceContinue(); - void Write(ArraySegment data); Task WriteAsync(ArraySegment data, CancellationToken cancellationToken); - void Flush(); Task FlushAsync(CancellationToken cancellationToken); } } diff --git a/src/Microsoft.AspNetCore.Server.Kestrel.Core/Internal/Http/OutputProducer.cs b/src/Microsoft.AspNetCore.Server.Kestrel.Core/Internal/Http/OutputProducer.cs index 0f72b16648..378ed8bb4e 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel.Core/Internal/Http/OutputProducer.cs +++ b/src/Microsoft.AspNetCore.Server.Kestrel.Core/Internal/Http/OutputProducer.cs @@ -39,11 +39,6 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http _flushCompleted = OnFlushCompleted; } - public void Write(ArraySegment buffer, bool chunk = false) - { - WriteAsync(buffer, default(CancellationToken), chunk).GetAwaiter().GetResult(); - } - public Task WriteAsync(ArraySegment buffer, bool chunk = false, CancellationToken cancellationToken = default(CancellationToken)) { if (cancellationToken.IsCancellationRequested) @@ -54,11 +49,6 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http return WriteAsync(buffer, cancellationToken, chunk); } - public void Flush() - { - WriteAsync(_emptyData, default(CancellationToken)).GetAwaiter().GetResult(); - } - public Task FlushAsync(CancellationToken cancellationToken = default(CancellationToken)) { return WriteAsync(_emptyData, cancellationToken); diff --git a/test/Microsoft.AspNetCore.Server.Kestrel.Core.Tests/FrameTests.cs b/test/Microsoft.AspNetCore.Server.Kestrel.Core.Tests/FrameTests.cs index 331ac40675..1923a56d9d 100644 --- a/test/Microsoft.AspNetCore.Server.Kestrel.Core.Tests/FrameTests.cs +++ b/test/Microsoft.AspNetCore.Server.Kestrel.Core.Tests/FrameTests.cs @@ -211,10 +211,10 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests } [Fact] - public void ThrowsWhenStatusCodeIsSetAfterResponseStarted() + public async Task ThrowsWhenStatusCodeIsSetAfterResponseStarted() { // Act - _frame.Write(new ArraySegment(new byte[1])); + await _frame.WriteAsync(new ArraySegment(new byte[1])); // Assert Assert.True(_frame.HasResponseStarted); @@ -222,10 +222,10 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests } [Fact] - public void ThrowsWhenReasonPhraseIsSetAfterResponseStarted() + public async Task ThrowsWhenReasonPhraseIsSetAfterResponseStarted() { // Act - _frame.Write(new ArraySegment(new byte[1])); + await _frame.WriteAsync(new ArraySegment(new byte[1])); // Assert Assert.True(_frame.HasResponseStarted); @@ -233,9 +233,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests } [Fact] - public void ThrowsWhenOnStartingIsSetAfterResponseStarted() + public async Task ThrowsWhenOnStartingIsSetAfterResponseStarted() { - _frame.Write(new ArraySegment(new byte[1])); + await _frame.WriteAsync(new ArraySegment(new byte[1])); // Act/Assert Assert.True(_frame.HasResponseStarted); @@ -472,13 +472,13 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests } [Fact] - public void WriteThrowsForNonBodyResponse() + public async Task WriteThrowsForNonBodyResponse() { // Arrange ((IHttpResponseFeature)_frame).StatusCode = StatusCodes.Status304NotModified; // Act/Assert - Assert.Throws(() => _frame.Write(new ArraySegment(new byte[1]))); + await Assert.ThrowsAsync(() => _frame.WriteAsync(new ArraySegment(new byte[1]))); } [Fact] @@ -493,14 +493,14 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests } [Fact] - public void WriteDoesNotThrowForHeadResponse() + public async Task WriteDoesNotThrowForHeadResponse() { // Arrange _frame.HttpVersion = "HTTP/1.1"; ((IHttpRequestFeature)_frame).Method = "HEAD"; // Act/Assert - _frame.Write(new ArraySegment(new byte[1])); + await _frame.WriteAsync(new ArraySegment(new byte[1])); } [Fact] @@ -515,7 +515,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests } [Fact] - public void ManuallySettingTransferEncodingThrowsForHeadResponse() + public async Task ManuallySettingTransferEncodingThrowsForHeadResponse() { // Arrange _frame.HttpVersion = "HTTP/1.1"; @@ -525,11 +525,11 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests _frame.ResponseHeaders.Add("Transfer-Encoding", "chunked"); // Assert - Assert.Throws(() => _frame.Flush()); + await Assert.ThrowsAsync(() => _frame.FlushAsync()); } [Fact] - public void ManuallySettingTransferEncodingThrowsForNoBodyResponse() + public async Task ManuallySettingTransferEncodingThrowsForNoBodyResponse() { // Arrange _frame.HttpVersion = "HTTP/1.1"; @@ -539,7 +539,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests _frame.ResponseHeaders.Add("Transfer-Encoding", "chunked"); // Assert - Assert.Throws(() => _frame.Flush()); + await Assert.ThrowsAsync(() => _frame.FlushAsync()); } [Fact] @@ -558,7 +558,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests } [Fact] - public void RequestAbortedTokenIsResetBeforeLastWriteWithContentLength() + public async Task RequestAbortedTokenIsResetBeforeLastWriteWithContentLength() { _frame.ResponseHeaders["Content-Length"] = "12"; @@ -567,11 +567,11 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests foreach (var ch in "hello, worl") { - _frame.Write(new ArraySegment(new[] { (byte)ch })); + await _frame.WriteAsync(new ArraySegment(new[] { (byte)ch })); Assert.Same(original, _frame.RequestAborted.WaitHandle); } - _frame.Write(new ArraySegment(new[] { (byte)'d' })); + await _frame.WriteAsync(new ArraySegment(new[] { (byte)'d' })); Assert.NotSame(original, _frame.RequestAborted.WaitHandle); } diff --git a/test/Microsoft.AspNetCore.Server.Kestrel.Core.Tests/TestHelpers/MockFrameControl.cs b/test/Microsoft.AspNetCore.Server.Kestrel.Core.Tests/TestHelpers/MockFrameControl.cs index cf26ef8f68..f9e2d1bb5e 100644 --- a/test/Microsoft.AspNetCore.Server.Kestrel.Core.Tests/TestHelpers/MockFrameControl.cs +++ b/test/Microsoft.AspNetCore.Server.Kestrel.Core.Tests/TestHelpers/MockFrameControl.cs @@ -11,10 +11,6 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests.TestHelpers { public class MockFrameControl : IFrameControl { - public void Flush() - { - } - public Task FlushAsync(CancellationToken cancellationToken) { return TaskCache.CompletedTask; @@ -24,10 +20,6 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests.TestHelpers { } - public void Write(ArraySegment data) - { - } - public Task WriteAsync(ArraySegment data, CancellationToken cancellationToken) { return TaskCache.CompletedTask; diff --git a/test/Microsoft.AspNetCore.Server.Kestrel.Core.Tests/TestInput.cs b/test/Microsoft.AspNetCore.Server.Kestrel.Core.Tests/TestInput.cs index 25a38d495d..1a6ce35dd3 100644 --- a/test/Microsoft.AspNetCore.Server.Kestrel.Core.Tests/TestInput.cs +++ b/test/Microsoft.AspNetCore.Server.Kestrel.Core.Tests/TestInput.cs @@ -36,7 +36,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests FrameContext.FrameControl = this; } - public IPipe Pipe { get; } + public IPipe Pipe { get; } public Frame FrameContext { get; set; } @@ -70,23 +70,11 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests { } - void IFrameControl.ProduceContinue() - { - } - - void IFrameControl.Write(ArraySegment data) - { - } - Task IFrameControl.WriteAsync(ArraySegment data, CancellationToken cancellationToken) { return TaskCache.CompletedTask; } - void IFrameControl.Flush() - { - } - Task IFrameControl.FlushAsync(CancellationToken cancellationToken) { return TaskCache.CompletedTask; diff --git a/test/Microsoft.AspNetCore.Server.Kestrel.Performance/FrameWritingBenchmark.cs b/test/Microsoft.AspNetCore.Server.Kestrel.Performance/FrameWritingBenchmark.cs index b1ba1658fb..ff1a3b5298 100644 --- a/test/Microsoft.AspNetCore.Server.Kestrel.Performance/FrameWritingBenchmark.cs +++ b/test/Microsoft.AspNetCore.Server.Kestrel.Performance/FrameWritingBenchmark.cs @@ -9,7 +9,6 @@ using Microsoft.AspNetCore.Server.Kestrel.Core; using Microsoft.AspNetCore.Server.Kestrel.Core.Internal; using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http; using Microsoft.AspNetCore.Server.Kestrel.Internal.System.IO.Pipelines; -using Microsoft.AspNetCore.Server.Kestrel.Performance.Mocks; using Microsoft.AspNetCore.Testing; namespace Microsoft.AspNetCore.Server.Kestrel.Performance @@ -38,18 +37,6 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Performance _frameChunked.RequestHeaders.Add("Transfer-Encoding", "chunked"); } - [Benchmark] - public void Write() - { - _frame.Write(new ArraySegment(_writeData)); - } - - [Benchmark] - public void WriteChunked() - { - _frameChunked.Write(new ArraySegment(_writeData)); - } - [Benchmark] public async Task WriteAsync() {