From 88b134f8772c6965d259459e01eb19d4fade9690 Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Thu, 12 Mar 2020 09:38:29 +1300 Subject: [PATCH] Reuse Http2MessageBody (#19629) --- .../src/Internal/Http/Http1MessageBody.cs | 3 +-- .../Core/src/Internal/Http/MessageBody.cs | 11 +++++++++++ .../src/Internal/Http2/Http2MessageBody.cs | 12 ++++-------- .../Core/src/Internal/Http2/Http2Stream.cs | 19 ++++++++++++++++++- 4 files changed, 34 insertions(+), 11 deletions(-) diff --git a/src/Servers/Kestrel/Core/src/Internal/Http/Http1MessageBody.cs b/src/Servers/Kestrel/Core/src/Internal/Http/Http1MessageBody.cs index 4b5d5b0872..c5993cd7cc 100644 --- a/src/Servers/Kestrel/Core/src/Internal/Http/Http1MessageBody.cs +++ b/src/Servers/Kestrel/Core/src/Internal/Http/Http1MessageBody.cs @@ -16,8 +16,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http protected readonly Http1Connection _context; protected bool _completed; - protected Http1MessageBody(Http1Connection context) - : base(context) + protected Http1MessageBody(Http1Connection context) : base(context) { _context = context; } diff --git a/src/Servers/Kestrel/Core/src/Internal/Http/MessageBody.cs b/src/Servers/Kestrel/Core/src/Internal/Http/MessageBody.cs index a97fd61a8a..e97712f0ae 100644 --- a/src/Servers/Kestrel/Core/src/Internal/Http/MessageBody.cs +++ b/src/Servers/Kestrel/Core/src/Internal/Http/MessageBody.cs @@ -73,6 +73,17 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http protected virtual Task OnStopAsync() => Task.CompletedTask; + public virtual void Reset() + { + _send100Continue = true; + _consumedBytes = 0; + _stopped = false; + _timingEnabled = false; + _backpressure = false; + _alreadyTimedBytes = 0; + _examinedUnconsumedBytes = 0; + } + protected void TryProduceContinue() { if (_send100Continue) diff --git a/src/Servers/Kestrel/Core/src/Internal/Http2/Http2MessageBody.cs b/src/Servers/Kestrel/Core/src/Internal/Http2/Http2MessageBody.cs index 7dad036475..dd62d69cbb 100644 --- a/src/Servers/Kestrel/Core/src/Internal/Http2/Http2MessageBody.cs +++ b/src/Servers/Kestrel/Core/src/Internal/Http2/Http2MessageBody.cs @@ -15,7 +15,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2 private readonly Http2Stream _context; private ReadResult _readResult; - private Http2MessageBody(Http2Stream context) + public Http2MessageBody(Http2Stream context) : base(context) { _context = context; @@ -46,14 +46,10 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2 AddAndCheckConsumedBytes(bytesRead); } - public static MessageBody For(Http2Stream context) + public override void Reset() { - if (context.ReceivedEmptyRequestBody) - { - return ZeroContentLengthClose; - } - - return new Http2MessageBody(context); + base.Reset(); + _readResult = default; } public override void AdvanceTo(SequencePosition consumed) diff --git a/src/Servers/Kestrel/Core/src/Internal/Http2/Http2Stream.cs b/src/Servers/Kestrel/Core/src/Internal/Http2/Http2Stream.cs index b46dc0f0f6..67c1e993d2 100644 --- a/src/Servers/Kestrel/Core/src/Internal/Http2/Http2Stream.cs +++ b/src/Servers/Kestrel/Core/src/Internal/Http2/Http2Stream.cs @@ -23,6 +23,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2 private Http2OutputProducer _http2Output; private StreamInputFlowControl _inputFlowControl; private StreamOutputFlowControl _outputFlowControl; + private Http2MessageBody _messageBody; private bool _decrementCalled; @@ -170,7 +171,23 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2 => StringUtilities.ConcatAsHexSuffix(ConnectionId, ':', (uint)StreamId); protected override MessageBody CreateMessageBody() - => Http2MessageBody.For(this); + { + if (ReceivedEmptyRequestBody) + { + return MessageBody.ZeroContentLengthClose; + } + + if (_messageBody != null) + { + _messageBody.Reset(); + } + else + { + _messageBody = new Http2MessageBody(this); + } + + return _messageBody; + } // Compare to Http1Connection.OnStartLine protected override bool TryParseRequest(ReadResult result, out bool endConnection)