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)
{