From a4c4ab6c5b8f4463afe02f52d341ab7f1745ff17 Mon Sep 17 00:00:00 2001 From: Chris R Date: Wed, 24 Mar 2021 14:50:16 -0700 Subject: [PATCH] Split the HPackEncoder partial class #31182 --- .../src/Internal/Http2/HPackHeaderWriter.cs | 10 ++++---- .../src/Internal/Http2/Http2FrameWriter.cs | 4 ++-- .../Core/test/Http2HPackEncoderTests.cs | 20 ++++++++-------- .../HPackHeaderWriterBenchmark.cs | 4 ++-- .../Http2ConnectionBenchmarkBase.cs | 4 ++-- .../test/PipeWriterHttp2FrameExtensions.cs | 2 +- .../Http2/Http2TestBase.cs | 4 ++-- ...oder.Dynamic.cs => DynamicHPackEncoder.cs} | 24 +++++++++---------- 8 files changed, 36 insertions(+), 36 deletions(-) rename src/Shared/Hpack/{HPackEncoder.Dynamic.cs => DynamicHPackEncoder.cs} (88%) diff --git a/src/Servers/Kestrel/Core/src/Internal/Http2/HPackHeaderWriter.cs b/src/Servers/Kestrel/Core/src/Internal/Http2/HPackHeaderWriter.cs index bcb67975e5eb..c57f1e28f518 100644 --- a/src/Servers/Kestrel/Core/src/Internal/Http2/HPackHeaderWriter.cs +++ b/src/Servers/Kestrel/Core/src/Internal/Http2/HPackHeaderWriter.cs @@ -12,7 +12,7 @@ internal static class HPackHeaderWriter /// /// Begin encoding headers in the first HEADERS frame. /// - public static bool BeginEncodeHeaders(int statusCode, HPackEncoder hpackEncoder, Http2HeadersEnumerator headersEnumerator, Span buffer, out int length) + public static bool BeginEncodeHeaders(int statusCode, DynamicHPackEncoder hpackEncoder, Http2HeadersEnumerator headersEnumerator, Span buffer, out int length) { length = 0; @@ -43,7 +43,7 @@ public static bool BeginEncodeHeaders(int statusCode, HPackEncoder hpackEncoder, /// /// Begin encoding headers in the first HEADERS frame. /// - public static bool BeginEncodeHeaders(HPackEncoder hpackEncoder, Http2HeadersEnumerator headersEnumerator, Span buffer, out int length) + public static bool BeginEncodeHeaders(DynamicHPackEncoder hpackEncoder, Http2HeadersEnumerator headersEnumerator, Span buffer, out int length) { length = 0; @@ -66,12 +66,12 @@ public static bool BeginEncodeHeaders(HPackEncoder hpackEncoder, Http2HeadersEnu /// /// Continue encoding headers in the next HEADERS frame. The enumerator should already have a current value. /// - public static bool ContinueEncodeHeaders(HPackEncoder hpackEncoder, Http2HeadersEnumerator headersEnumerator, Span buffer, out int length) + public static bool ContinueEncodeHeaders(DynamicHPackEncoder hpackEncoder, Http2HeadersEnumerator headersEnumerator, Span buffer, out int length) { return EncodeHeadersCore(hpackEncoder, headersEnumerator, buffer, throwIfNoneEncoded: true, out length); } - private static bool EncodeStatusHeader(int statusCode, HPackEncoder hpackEncoder, Span buffer, out int length) + private static bool EncodeStatusHeader(int statusCode, DynamicHPackEncoder hpackEncoder, Span buffer, out int length) { switch (statusCode) { @@ -91,7 +91,7 @@ private static bool EncodeStatusHeader(int statusCode, HPackEncoder hpackEncoder } } - private static bool EncodeHeadersCore(HPackEncoder hpackEncoder, Http2HeadersEnumerator headersEnumerator, Span buffer, bool throwIfNoneEncoded, out int length) + private static bool EncodeHeadersCore(DynamicHPackEncoder hpackEncoder, Http2HeadersEnumerator headersEnumerator, Span buffer, bool throwIfNoneEncoded, out int length) { var currentLength = 0; do diff --git a/src/Servers/Kestrel/Core/src/Internal/Http2/Http2FrameWriter.cs b/src/Servers/Kestrel/Core/src/Internal/Http2/Http2FrameWriter.cs index 2de1900d1430..dfd06eb2e03c 100644 --- a/src/Servers/Kestrel/Core/src/Internal/Http2/Http2FrameWriter.cs +++ b/src/Servers/Kestrel/Core/src/Internal/Http2/Http2FrameWriter.cs @@ -38,7 +38,7 @@ internal class Http2FrameWriter private readonly ITimeoutControl _timeoutControl; private readonly MinDataRate? _minResponseDataRate; private readonly TimingPipeFlusher _flusher; - private readonly HPackEncoder _hpackEncoder; + private readonly DynamicHPackEncoder _hpackEncoder; private uint _maxFrameSize = Http2PeerSettings.MinAllowedMaxFrameSize; private byte[] _headerEncodingBuffer; @@ -71,7 +71,7 @@ public Http2FrameWriter( _outgoingFrame = new Http2Frame(); _headerEncodingBuffer = new byte[_maxFrameSize]; - _hpackEncoder = new HPackEncoder(serviceContext.ServerOptions.AllowResponseHeaderCompression); + _hpackEncoder = new DynamicHPackEncoder(serviceContext.ServerOptions.AllowResponseHeaderCompression); } public void UpdateMaxHeaderTableSize(uint maxHeaderTableSize) diff --git a/src/Servers/Kestrel/Core/test/Http2HPackEncoderTests.cs b/src/Servers/Kestrel/Core/test/Http2HPackEncoderTests.cs index c9dcdb00ecaa..ea49917af237 100644 --- a/src/Servers/Kestrel/Core/test/Http2HPackEncoderTests.cs +++ b/src/Servers/Kestrel/Core/test/Http2HPackEncoderTests.cs @@ -26,7 +26,7 @@ public void BeginEncodeHeaders_Status302_NewIndexValue() var enumerator = new Http2HeadersEnumerator(); enumerator.Initialize(headers); - var hpackEncoder = new HPackEncoder(); + var hpackEncoder = new DynamicHPackEncoder(); Assert.True(HPackHeaderWriter.BeginEncodeHeaders(302, hpackEncoder, enumerator, buffer, out var length)); var result = buffer.Slice(0, length).ToArray(); @@ -49,7 +49,7 @@ public void BeginEncodeHeaders_CacheControlPrivate_NewIndexValue() var enumerator = new Http2HeadersEnumerator(); enumerator.Initialize(headers); - var hpackEncoder = new HPackEncoder(); + var hpackEncoder = new DynamicHPackEncoder(); Assert.True(HPackHeaderWriter.BeginEncodeHeaders(302, hpackEncoder, enumerator, buffer, out var length)); var result = buffer.Slice(5, length - 5).ToArray(); @@ -75,7 +75,7 @@ public void BeginEncodeHeaders_MaxHeaderTableSizeExceeded_EvictionsToFit() var enumerator = new Http2HeadersEnumerator(); - var hpackEncoder = new HPackEncoder(maxHeaderTableSize: 256); + var hpackEncoder = new DynamicHPackEncoder(maxHeaderTableSize: 256); // First response enumerator.Initialize(headers); @@ -201,7 +201,7 @@ public void BeginEncodeHeaders_ExcludedHeaders_NotAddedToTable(string headerName var enumerator = new Http2HeadersEnumerator(); enumerator.Initialize(headers); - var hpackEncoder = new HPackEncoder(maxHeaderTableSize: Http2PeerSettings.DefaultHeaderTableSize); + var hpackEncoder = new DynamicHPackEncoder(maxHeaderTableSize: Http2PeerSettings.DefaultHeaderTableSize); Assert.True(HPackHeaderWriter.BeginEncodeHeaders(hpackEncoder, enumerator, buffer, out _)); if (neverIndex) @@ -227,7 +227,7 @@ public void BeginEncodeHeaders_HeaderExceedHeaderTableSize_NoIndexAndNoHeaderEnt var enumerator = new Http2HeadersEnumerator(); enumerator.Initialize(headers); - var hpackEncoder = new HPackEncoder(); + var hpackEncoder = new DynamicHPackEncoder(); Assert.True(HPackHeaderWriter.BeginEncodeHeaders(200, hpackEncoder, enumerator, buffer, out var length)); Assert.Empty(GetHeaderEntries(hpackEncoder)); @@ -312,7 +312,7 @@ public void BeginEncodeHeaders_HeaderExceedHeaderTableSize_NoIndexAndNoHeaderEnt [MemberData(nameof(SinglePayloadData))] public void EncodesHeadersInSinglePayloadWhenSpaceAvailable(KeyValuePair[] headers, byte[] expectedPayload, int? statusCode) { - HPackEncoder hpackEncoder = new HPackEncoder(); + var hpackEncoder = new DynamicHPackEncoder(); var payload = new byte[1024]; var length = 0; @@ -376,7 +376,7 @@ public void EncodesHeadersInMultiplePayloadsWhenSpaceNotAvailable(bool exactSize 0x07, 0x4b, 0x65, 0x73, 0x74, 0x72, 0x65, 0x6c }; - var hpackEncoder = new HPackEncoder(); + var hpackEncoder = new DynamicHPackEncoder(); Span payload = new byte[1024]; var offset = 0; @@ -415,7 +415,7 @@ public void BeginEncodeHeaders_MaxHeaderTableSizeUpdated_SizeUpdateInHeaders() { Span buffer = new byte[1024 * 16]; - var hpackEncoder = new HPackEncoder(); + var hpackEncoder = new DynamicHPackEncoder(); hpackEncoder.UpdateMaxHeaderTableSize(100); var enumerator = new Http2HeadersEnumerator(); @@ -452,7 +452,7 @@ private static Http2HeadersEnumerator GetHeadersEnumerator(IEnumerable= 0) @@ -462,7 +462,7 @@ private EncoderHeaderEntry GetHeaderEntry(HPackEncoder encoder, int index) return entry; } - private List GetHeaderEntries(HPackEncoder encoder) + private List GetHeaderEntries(DynamicHPackEncoder encoder) { var headers = new List(); diff --git a/src/Servers/Kestrel/perf/Microbenchmarks/HPackHeaderWriterBenchmark.cs b/src/Servers/Kestrel/perf/Microbenchmarks/HPackHeaderWriterBenchmark.cs index 3a18915982c1..259071dd434c 100644 --- a/src/Servers/Kestrel/perf/Microbenchmarks/HPackHeaderWriterBenchmark.cs +++ b/src/Servers/Kestrel/perf/Microbenchmarks/HPackHeaderWriterBenchmark.cs @@ -16,7 +16,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Microbenchmarks public class HPackHeaderWriterBenchmark { private Http2HeadersEnumerator _http2HeadersEnumerator; - private HPackEncoder _hpackEncoder; + private DynamicHPackEncoder _hpackEncoder; private HttpResponseHeaders _knownResponseHeaders; private HttpResponseHeaders _unknownResponseHeaders; private byte[] _buffer; @@ -25,7 +25,7 @@ public class HPackHeaderWriterBenchmark public void GlobalSetup() { _http2HeadersEnumerator = new Http2HeadersEnumerator(); - _hpackEncoder = new HPackEncoder(); + _hpackEncoder = new DynamicHPackEncoder(); _buffer = new byte[1024 * 1024]; _knownResponseHeaders = new HttpResponseHeaders diff --git a/src/Servers/Kestrel/perf/Microbenchmarks/Http2ConnectionBenchmarkBase.cs b/src/Servers/Kestrel/perf/Microbenchmarks/Http2ConnectionBenchmarkBase.cs index f6f101b758d5..0c49f277eff6 100644 --- a/src/Servers/Kestrel/perf/Microbenchmarks/Http2ConnectionBenchmarkBase.cs +++ b/src/Servers/Kestrel/perf/Microbenchmarks/Http2ConnectionBenchmarkBase.cs @@ -30,7 +30,7 @@ public abstract class Http2ConnectionBenchmarkBase private MemoryPool _memoryPool; private HttpRequestHeaders _httpRequestHeaders; private Http2Connection _connection; - private HPackEncoder _hpackEncoder; + private DynamicHPackEncoder _hpackEncoder; private Http2HeadersEnumerator _requestHeadersEnumerator; private int _currentStreamId; private byte[] _headersBuffer; @@ -56,7 +56,7 @@ public virtual void GlobalSetup() _httpRequestHeaders.HeaderAuthority = new StringValues("localhost:80"); _headersBuffer = new byte[1024 * 16]; - _hpackEncoder = new HPackEncoder(); + _hpackEncoder = new DynamicHPackEncoder(); var serviceContext = TestContextFactory.CreateServiceContext( serverOptions: new KestrelServerOptions(), diff --git a/src/Servers/Kestrel/shared/test/PipeWriterHttp2FrameExtensions.cs b/src/Servers/Kestrel/shared/test/PipeWriterHttp2FrameExtensions.cs index a99db7dfe4e5..281128d733f0 100644 --- a/src/Servers/Kestrel/shared/test/PipeWriterHttp2FrameExtensions.cs +++ b/src/Servers/Kestrel/shared/test/PipeWriterHttp2FrameExtensions.cs @@ -25,7 +25,7 @@ public static void WriteSettings(this PipeWriter writer, Http2PeerSettings clien writer.Write(payload); } - public static void WriteStartStream(this PipeWriter writer, int streamId, HPackEncoder hpackEncoder, Http2HeadersEnumerator headers, byte[] headerEncodingBuffer, bool endStream, Http2Frame frame = null) + public static void WriteStartStream(this PipeWriter writer, int streamId, DynamicHPackEncoder hpackEncoder, Http2HeadersEnumerator headers, byte[] headerEncodingBuffer, bool endStream, Http2Frame frame = null) { frame ??= new Http2Frame(); frame.PrepareHeaders(Http2HeadersFrameFlags.NONE, streamId); diff --git a/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http2/Http2TestBase.cs b/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http2/Http2TestBase.cs index 70d62d756803..8e288cb2de6e 100644 --- a/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http2/Http2TestBase.cs +++ b/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http2/Http2TestBase.cs @@ -123,7 +123,7 @@ protected static IEnumerable> ReadRateRequestHeader internal readonly Http2PeerSettings _clientSettings = new Http2PeerSettings(); internal readonly HPackDecoder _hpackDecoder; - internal readonly HPackEncoder _hpackEncoder; + internal readonly DynamicHPackEncoder _hpackEncoder; private readonly byte[] _headerEncodingBuffer = new byte[Http2PeerSettings.MinAllowedMaxFrameSize]; internal readonly TimeoutControl _timeoutControl; @@ -168,7 +168,7 @@ protected static IEnumerable> ReadRateRequestHeader public Http2TestBase() { _hpackDecoder = new HPackDecoder((int)_clientSettings.HeaderTableSize, MaxRequestHeaderFieldSize); - _hpackEncoder = new HPackEncoder(); + _hpackEncoder = new DynamicHPackEncoder(); _timeoutControl = new TimeoutControl(_mockTimeoutHandler.Object); _mockTimeoutControl = new Mock(_timeoutControl) { CallBase = true }; diff --git a/src/Shared/Hpack/HPackEncoder.Dynamic.cs b/src/Shared/Hpack/DynamicHPackEncoder.cs similarity index 88% rename from src/Shared/Hpack/HPackEncoder.Dynamic.cs rename to src/Shared/Hpack/DynamicHPackEncoder.cs index 4c3b36bc387c..60bfc4af8fbc 100644 --- a/src/Shared/Hpack/HPackEncoder.Dynamic.cs +++ b/src/Shared/Hpack/DynamicHPackEncoder.cs @@ -7,7 +7,7 @@ namespace System.Net.Http.HPack { - internal partial class HPackEncoder + internal class DynamicHPackEncoder { public const int DefaultHeaderTableSize = 4096; @@ -22,7 +22,7 @@ internal partial class HPackEncoder private bool _pendingTableSizeUpdate; private EncoderHeaderEntry? _removed; - public HPackEncoder(bool allowDynamicCompression = true, uint maxHeaderTableSize = DefaultHeaderTableSize) + public DynamicHPackEncoder(bool allowDynamicCompression = true, uint maxHeaderTableSize = DefaultHeaderTableSize) { _allowDynamicCompression = allowDynamicCompression; _maxHeaderTableSize = maxHeaderTableSize; @@ -54,7 +54,7 @@ public bool EnsureDynamicTableSizeUpdate(Span buffer, out int length) // Check if there is a table size update that should be encoded if (_pendingTableSizeUpdate) { - bool success = EncodeDynamicTableSizeUpdate((int)_maxHeaderTableSize, buffer, out length); + bool success = HPackEncoder.EncodeDynamicTableSizeUpdate((int)_maxHeaderTableSize, buffer, out length); _pendingTableSizeUpdate = false; return success; } @@ -73,16 +73,16 @@ public bool EncodeHeader(Span buffer, int staticTableIndex, HeaderEncoding int index = ResolveDynamicTableIndex(staticTableIndex, name); return index == -1 - ? EncodeLiteralHeaderFieldNeverIndexingNewName(name, value, buffer, out bytesWritten) - : EncodeLiteralHeaderFieldNeverIndexing(index, value, buffer, out bytesWritten); + ? HPackEncoder.EncodeLiteralHeaderFieldNeverIndexingNewName(name, value, buffer, out bytesWritten) + : HPackEncoder.EncodeLiteralHeaderFieldNeverIndexing(index, value, buffer, out bytesWritten); } // No dynamic table. Only use the static table. if (!_allowDynamicCompression || _maxHeaderTableSize == 0 || encodingHint == HeaderEncodingHint.IgnoreIndex) { return staticTableIndex == -1 - ? EncodeLiteralHeaderFieldWithoutIndexingNewName(name, value, buffer, out bytesWritten) - : EncodeLiteralHeaderFieldWithoutIndexing(staticTableIndex, value, buffer, out bytesWritten); + ? HPackEncoder.EncodeLiteralHeaderFieldWithoutIndexingNewName(name, value, buffer, out bytesWritten) + : HPackEncoder.EncodeLiteralHeaderFieldWithoutIndexing(staticTableIndex, value, buffer, out bytesWritten); } // Header is greater than the maximum table size. @@ -92,8 +92,8 @@ public bool EncodeHeader(Span buffer, int staticTableIndex, HeaderEncoding int index = ResolveDynamicTableIndex(staticTableIndex, name); return index == -1 - ? EncodeLiteralHeaderFieldWithoutIndexingNewName(name, value, buffer, out bytesWritten) - : EncodeLiteralHeaderFieldWithoutIndexing(index, value, buffer, out bytesWritten); + ? HPackEncoder.EncodeLiteralHeaderFieldWithoutIndexingNewName(name, value, buffer, out bytesWritten) + : HPackEncoder.EncodeLiteralHeaderFieldWithoutIndexing(index, value, buffer, out bytesWritten); } return EncodeDynamicHeader(buffer, staticTableIndex, name, value, out bytesWritten); @@ -117,7 +117,7 @@ private bool EncodeDynamicHeader(Span buffer, int staticTableIndex, string { // Already exists in dynamic table. Write index. int index = CalculateDynamicTableIndex(headerField.Index); - return EncodeIndexedHeaderField(index, buffer, out bytesWritten); + return HPackEncoder.EncodeIndexedHeaderField(index, buffer, out bytesWritten); } else { @@ -126,8 +126,8 @@ private bool EncodeDynamicHeader(Span buffer, int staticTableIndex, string int index = ResolveDynamicTableIndex(staticTableIndex, name); bool success = index == -1 - ? EncodeLiteralHeaderFieldIndexingNewName(name, value, buffer, out bytesWritten) - : EncodeLiteralHeaderFieldIndexing(index, value, buffer, out bytesWritten); + ? HPackEncoder.EncodeLiteralHeaderFieldIndexingNewName(name, value, buffer, out bytesWritten) + : HPackEncoder.EncodeLiteralHeaderFieldIndexing(index, value, buffer, out bytesWritten); if (success) {