Skip to content

Commit 94cd7b9

Browse files
authored
Split the HPackEncoder partial class (#31210)
1 parent 730e39b commit 94cd7b9

File tree

8 files changed

+36
-36
lines changed

8 files changed

+36
-36
lines changed

src/Servers/Kestrel/Core/src/Internal/Http2/HPackHeaderWriter.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ internal static class HPackHeaderWriter
1212
/// <summary>
1313
/// Begin encoding headers in the first HEADERS frame.
1414
/// </summary>
15-
public static bool BeginEncodeHeaders(int statusCode, HPackEncoder hpackEncoder, Http2HeadersEnumerator headersEnumerator, Span<byte> buffer, out int length)
15+
public static bool BeginEncodeHeaders(int statusCode, DynamicHPackEncoder hpackEncoder, Http2HeadersEnumerator headersEnumerator, Span<byte> buffer, out int length)
1616
{
1717
length = 0;
1818

@@ -43,7 +43,7 @@ public static bool BeginEncodeHeaders(int statusCode, HPackEncoder hpackEncoder,
4343
/// <summary>
4444
/// Begin encoding headers in the first HEADERS frame.
4545
/// </summary>
46-
public static bool BeginEncodeHeaders(HPackEncoder hpackEncoder, Http2HeadersEnumerator headersEnumerator, Span<byte> buffer, out int length)
46+
public static bool BeginEncodeHeaders(DynamicHPackEncoder hpackEncoder, Http2HeadersEnumerator headersEnumerator, Span<byte> buffer, out int length)
4747
{
4848
length = 0;
4949

@@ -66,12 +66,12 @@ public static bool BeginEncodeHeaders(HPackEncoder hpackEncoder, Http2HeadersEnu
6666
/// <summary>
6767
/// Continue encoding headers in the next HEADERS frame. The enumerator should already have a current value.
6868
/// </summary>
69-
public static bool ContinueEncodeHeaders(HPackEncoder hpackEncoder, Http2HeadersEnumerator headersEnumerator, Span<byte> buffer, out int length)
69+
public static bool ContinueEncodeHeaders(DynamicHPackEncoder hpackEncoder, Http2HeadersEnumerator headersEnumerator, Span<byte> buffer, out int length)
7070
{
7171
return EncodeHeadersCore(hpackEncoder, headersEnumerator, buffer, throwIfNoneEncoded: true, out length);
7272
}
7373

74-
private static bool EncodeStatusHeader(int statusCode, HPackEncoder hpackEncoder, Span<byte> buffer, out int length)
74+
private static bool EncodeStatusHeader(int statusCode, DynamicHPackEncoder hpackEncoder, Span<byte> buffer, out int length)
7575
{
7676
switch (statusCode)
7777
{
@@ -91,7 +91,7 @@ private static bool EncodeStatusHeader(int statusCode, HPackEncoder hpackEncoder
9191
}
9292
}
9393

94-
private static bool EncodeHeadersCore(HPackEncoder hpackEncoder, Http2HeadersEnumerator headersEnumerator, Span<byte> buffer, bool throwIfNoneEncoded, out int length)
94+
private static bool EncodeHeadersCore(DynamicHPackEncoder hpackEncoder, Http2HeadersEnumerator headersEnumerator, Span<byte> buffer, bool throwIfNoneEncoded, out int length)
9595
{
9696
var currentLength = 0;
9797
do

src/Servers/Kestrel/Core/src/Internal/Http2/Http2FrameWriter.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ internal class Http2FrameWriter
3838
private readonly ITimeoutControl _timeoutControl;
3939
private readonly MinDataRate? _minResponseDataRate;
4040
private readonly TimingPipeFlusher _flusher;
41-
private readonly HPackEncoder _hpackEncoder;
41+
private readonly DynamicHPackEncoder _hpackEncoder;
4242

4343
private uint _maxFrameSize = Http2PeerSettings.MinAllowedMaxFrameSize;
4444
private byte[] _headerEncodingBuffer;
@@ -71,7 +71,7 @@ public Http2FrameWriter(
7171
_outgoingFrame = new Http2Frame();
7272
_headerEncodingBuffer = new byte[_maxFrameSize];
7373

74-
_hpackEncoder = new HPackEncoder(serviceContext.ServerOptions.AllowResponseHeaderCompression);
74+
_hpackEncoder = new DynamicHPackEncoder(serviceContext.ServerOptions.AllowResponseHeaderCompression);
7575
}
7676

7777
public void UpdateMaxHeaderTableSize(uint maxHeaderTableSize)

src/Servers/Kestrel/Core/test/Http2HPackEncoderTests.cs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public void BeginEncodeHeaders_Status302_NewIndexValue()
2626
var enumerator = new Http2HeadersEnumerator();
2727
enumerator.Initialize(headers);
2828

29-
var hpackEncoder = new HPackEncoder();
29+
var hpackEncoder = new DynamicHPackEncoder();
3030
Assert.True(HPackHeaderWriter.BeginEncodeHeaders(302, hpackEncoder, enumerator, buffer, out var length));
3131

3232
var result = buffer.Slice(0, length).ToArray();
@@ -49,7 +49,7 @@ public void BeginEncodeHeaders_CacheControlPrivate_NewIndexValue()
4949
var enumerator = new Http2HeadersEnumerator();
5050
enumerator.Initialize(headers);
5151

52-
var hpackEncoder = new HPackEncoder();
52+
var hpackEncoder = new DynamicHPackEncoder();
5353
Assert.True(HPackHeaderWriter.BeginEncodeHeaders(302, hpackEncoder, enumerator, buffer, out var length));
5454

5555
var result = buffer.Slice(5, length - 5).ToArray();
@@ -75,7 +75,7 @@ public void BeginEncodeHeaders_MaxHeaderTableSizeExceeded_EvictionsToFit()
7575

7676
var enumerator = new Http2HeadersEnumerator();
7777

78-
var hpackEncoder = new HPackEncoder(maxHeaderTableSize: 256);
78+
var hpackEncoder = new DynamicHPackEncoder(maxHeaderTableSize: 256);
7979

8080
// First response
8181
enumerator.Initialize(headers);
@@ -201,7 +201,7 @@ public void BeginEncodeHeaders_ExcludedHeaders_NotAddedToTable(string headerName
201201
var enumerator = new Http2HeadersEnumerator();
202202
enumerator.Initialize(headers);
203203

204-
var hpackEncoder = new HPackEncoder(maxHeaderTableSize: Http2PeerSettings.DefaultHeaderTableSize);
204+
var hpackEncoder = new DynamicHPackEncoder(maxHeaderTableSize: Http2PeerSettings.DefaultHeaderTableSize);
205205
Assert.True(HPackHeaderWriter.BeginEncodeHeaders(hpackEncoder, enumerator, buffer, out _));
206206

207207
if (neverIndex)
@@ -227,7 +227,7 @@ public void BeginEncodeHeaders_HeaderExceedHeaderTableSize_NoIndexAndNoHeaderEnt
227227
var enumerator = new Http2HeadersEnumerator();
228228
enumerator.Initialize(headers);
229229

230-
var hpackEncoder = new HPackEncoder();
230+
var hpackEncoder = new DynamicHPackEncoder();
231231
Assert.True(HPackHeaderWriter.BeginEncodeHeaders(200, hpackEncoder, enumerator, buffer, out var length));
232232

233233
Assert.Empty(GetHeaderEntries(hpackEncoder));
@@ -312,7 +312,7 @@ public void BeginEncodeHeaders_HeaderExceedHeaderTableSize_NoIndexAndNoHeaderEnt
312312
[MemberData(nameof(SinglePayloadData))]
313313
public void EncodesHeadersInSinglePayloadWhenSpaceAvailable(KeyValuePair<string, string>[] headers, byte[] expectedPayload, int? statusCode)
314314
{
315-
HPackEncoder hpackEncoder = new HPackEncoder();
315+
var hpackEncoder = new DynamicHPackEncoder();
316316

317317
var payload = new byte[1024];
318318
var length = 0;
@@ -376,7 +376,7 @@ public void EncodesHeadersInMultiplePayloadsWhenSpaceNotAvailable(bool exactSize
376376
0x07, 0x4b, 0x65, 0x73, 0x74, 0x72, 0x65, 0x6c
377377
};
378378

379-
var hpackEncoder = new HPackEncoder();
379+
var hpackEncoder = new DynamicHPackEncoder();
380380

381381
Span<byte> payload = new byte[1024];
382382
var offset = 0;
@@ -415,7 +415,7 @@ public void BeginEncodeHeaders_MaxHeaderTableSizeUpdated_SizeUpdateInHeaders()
415415
{
416416
Span<byte> buffer = new byte[1024 * 16];
417417

418-
var hpackEncoder = new HPackEncoder();
418+
var hpackEncoder = new DynamicHPackEncoder();
419419
hpackEncoder.UpdateMaxHeaderTableSize(100);
420420

421421
var enumerator = new Http2HeadersEnumerator();
@@ -452,7 +452,7 @@ private static Http2HeadersEnumerator GetHeadersEnumerator(IEnumerable<KeyValueP
452452
return enumerator;
453453
}
454454

455-
private EncoderHeaderEntry GetHeaderEntry(HPackEncoder encoder, int index)
455+
private EncoderHeaderEntry GetHeaderEntry(DynamicHPackEncoder encoder, int index)
456456
{
457457
var entry = encoder.Head;
458458
while (index-- >= 0)
@@ -462,7 +462,7 @@ private EncoderHeaderEntry GetHeaderEntry(HPackEncoder encoder, int index)
462462
return entry;
463463
}
464464

465-
private List<EncoderHeaderEntry> GetHeaderEntries(HPackEncoder encoder)
465+
private List<EncoderHeaderEntry> GetHeaderEntries(DynamicHPackEncoder encoder)
466466
{
467467
var headers = new List<EncoderHeaderEntry>();
468468

src/Servers/Kestrel/perf/Microbenchmarks/HPackHeaderWriterBenchmark.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Microbenchmarks
1616
public class HPackHeaderWriterBenchmark
1717
{
1818
private Http2HeadersEnumerator _http2HeadersEnumerator;
19-
private HPackEncoder _hpackEncoder;
19+
private DynamicHPackEncoder _hpackEncoder;
2020
private HttpResponseHeaders _knownResponseHeaders;
2121
private HttpResponseHeaders _unknownResponseHeaders;
2222
private byte[] _buffer;
@@ -25,7 +25,7 @@ public class HPackHeaderWriterBenchmark
2525
public void GlobalSetup()
2626
{
2727
_http2HeadersEnumerator = new Http2HeadersEnumerator();
28-
_hpackEncoder = new HPackEncoder();
28+
_hpackEncoder = new DynamicHPackEncoder();
2929
_buffer = new byte[1024 * 1024];
3030

3131
_knownResponseHeaders = new HttpResponseHeaders

src/Servers/Kestrel/perf/Microbenchmarks/Http2ConnectionBenchmarkBase.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public abstract class Http2ConnectionBenchmarkBase
3030
private MemoryPool<byte> _memoryPool;
3131
private HttpRequestHeaders _httpRequestHeaders;
3232
private Http2Connection _connection;
33-
private HPackEncoder _hpackEncoder;
33+
private DynamicHPackEncoder _hpackEncoder;
3434
private Http2HeadersEnumerator _requestHeadersEnumerator;
3535
private int _currentStreamId;
3636
private byte[] _headersBuffer;
@@ -56,7 +56,7 @@ public virtual void GlobalSetup()
5656
_httpRequestHeaders.HeaderAuthority = new StringValues("localhost:80");
5757

5858
_headersBuffer = new byte[1024 * 16];
59-
_hpackEncoder = new HPackEncoder();
59+
_hpackEncoder = new DynamicHPackEncoder();
6060

6161
var serviceContext = TestContextFactory.CreateServiceContext(
6262
serverOptions: new KestrelServerOptions(),

src/Servers/Kestrel/shared/test/PipeWriterHttp2FrameExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public static void WriteSettings(this PipeWriter writer, Http2PeerSettings clien
2525
writer.Write(payload);
2626
}
2727

28-
public static void WriteStartStream(this PipeWriter writer, int streamId, HPackEncoder hpackEncoder, Http2HeadersEnumerator headers, byte[] headerEncodingBuffer, bool endStream, Http2Frame frame = null)
28+
public static void WriteStartStream(this PipeWriter writer, int streamId, DynamicHPackEncoder hpackEncoder, Http2HeadersEnumerator headers, byte[] headerEncodingBuffer, bool endStream, Http2Frame frame = null)
2929
{
3030
frame ??= new Http2Frame();
3131
frame.PrepareHeaders(Http2HeadersFrameFlags.NONE, streamId);

src/Servers/Kestrel/test/InMemory.FunctionalTests/Http2/Http2TestBase.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ protected static IEnumerable<KeyValuePair<string, string>> ReadRateRequestHeader
123123

124124
internal readonly Http2PeerSettings _clientSettings = new Http2PeerSettings();
125125
internal readonly HPackDecoder _hpackDecoder;
126-
internal readonly HPackEncoder _hpackEncoder;
126+
internal readonly DynamicHPackEncoder _hpackEncoder;
127127
private readonly byte[] _headerEncodingBuffer = new byte[Http2PeerSettings.MinAllowedMaxFrameSize];
128128

129129
internal readonly TimeoutControl _timeoutControl;
@@ -168,7 +168,7 @@ protected static IEnumerable<KeyValuePair<string, string>> ReadRateRequestHeader
168168
public Http2TestBase()
169169
{
170170
_hpackDecoder = new HPackDecoder((int)_clientSettings.HeaderTableSize, MaxRequestHeaderFieldSize);
171-
_hpackEncoder = new HPackEncoder();
171+
_hpackEncoder = new DynamicHPackEncoder();
172172

173173
_timeoutControl = new TimeoutControl(_mockTimeoutHandler.Object);
174174
_mockTimeoutControl = new Mock<MockTimeoutControlBase>(_timeoutControl) { CallBase = true };

src/Shared/Hpack/HPackEncoder.Dynamic.cs renamed to src/Shared/Hpack/DynamicHPackEncoder.cs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
namespace System.Net.Http.HPack
99
{
10-
internal partial class HPackEncoder
10+
internal class DynamicHPackEncoder
1111
{
1212
public const int DefaultHeaderTableSize = 4096;
1313

@@ -22,7 +22,7 @@ internal partial class HPackEncoder
2222
private bool _pendingTableSizeUpdate;
2323
private EncoderHeaderEntry? _removed;
2424

25-
public HPackEncoder(bool allowDynamicCompression = true, uint maxHeaderTableSize = DefaultHeaderTableSize)
25+
public DynamicHPackEncoder(bool allowDynamicCompression = true, uint maxHeaderTableSize = DefaultHeaderTableSize)
2626
{
2727
_allowDynamicCompression = allowDynamicCompression;
2828
_maxHeaderTableSize = maxHeaderTableSize;
@@ -54,7 +54,7 @@ public bool EnsureDynamicTableSizeUpdate(Span<byte> buffer, out int length)
5454
// Check if there is a table size update that should be encoded
5555
if (_pendingTableSizeUpdate)
5656
{
57-
bool success = EncodeDynamicTableSizeUpdate((int)_maxHeaderTableSize, buffer, out length);
57+
bool success = HPackEncoder.EncodeDynamicTableSizeUpdate((int)_maxHeaderTableSize, buffer, out length);
5858
_pendingTableSizeUpdate = false;
5959
return success;
6060
}
@@ -73,16 +73,16 @@ public bool EncodeHeader(Span<byte> buffer, int staticTableIndex, HeaderEncoding
7373
int index = ResolveDynamicTableIndex(staticTableIndex, name);
7474

7575
return index == -1
76-
? EncodeLiteralHeaderFieldNeverIndexingNewName(name, value, buffer, out bytesWritten)
77-
: EncodeLiteralHeaderFieldNeverIndexing(index, value, buffer, out bytesWritten);
76+
? HPackEncoder.EncodeLiteralHeaderFieldNeverIndexingNewName(name, value, buffer, out bytesWritten)
77+
: HPackEncoder.EncodeLiteralHeaderFieldNeverIndexing(index, value, buffer, out bytesWritten);
7878
}
7979

8080
// No dynamic table. Only use the static table.
8181
if (!_allowDynamicCompression || _maxHeaderTableSize == 0 || encodingHint == HeaderEncodingHint.IgnoreIndex)
8282
{
8383
return staticTableIndex == -1
84-
? EncodeLiteralHeaderFieldWithoutIndexingNewName(name, value, buffer, out bytesWritten)
85-
: EncodeLiteralHeaderFieldWithoutIndexing(staticTableIndex, value, buffer, out bytesWritten);
84+
? HPackEncoder.EncodeLiteralHeaderFieldWithoutIndexingNewName(name, value, buffer, out bytesWritten)
85+
: HPackEncoder.EncodeLiteralHeaderFieldWithoutIndexing(staticTableIndex, value, buffer, out bytesWritten);
8686
}
8787

8888
// Header is greater than the maximum table size.
@@ -92,8 +92,8 @@ public bool EncodeHeader(Span<byte> buffer, int staticTableIndex, HeaderEncoding
9292
int index = ResolveDynamicTableIndex(staticTableIndex, name);
9393

9494
return index == -1
95-
? EncodeLiteralHeaderFieldWithoutIndexingNewName(name, value, buffer, out bytesWritten)
96-
: EncodeLiteralHeaderFieldWithoutIndexing(index, value, buffer, out bytesWritten);
95+
? HPackEncoder.EncodeLiteralHeaderFieldWithoutIndexingNewName(name, value, buffer, out bytesWritten)
96+
: HPackEncoder.EncodeLiteralHeaderFieldWithoutIndexing(index, value, buffer, out bytesWritten);
9797
}
9898

9999
return EncodeDynamicHeader(buffer, staticTableIndex, name, value, out bytesWritten);
@@ -117,7 +117,7 @@ private bool EncodeDynamicHeader(Span<byte> buffer, int staticTableIndex, string
117117
{
118118
// Already exists in dynamic table. Write index.
119119
int index = CalculateDynamicTableIndex(headerField.Index);
120-
return EncodeIndexedHeaderField(index, buffer, out bytesWritten);
120+
return HPackEncoder.EncodeIndexedHeaderField(index, buffer, out bytesWritten);
121121
}
122122
else
123123
{
@@ -126,8 +126,8 @@ private bool EncodeDynamicHeader(Span<byte> buffer, int staticTableIndex, string
126126

127127
int index = ResolveDynamicTableIndex(staticTableIndex, name);
128128
bool success = index == -1
129-
? EncodeLiteralHeaderFieldIndexingNewName(name, value, buffer, out bytesWritten)
130-
: EncodeLiteralHeaderFieldIndexing(index, value, buffer, out bytesWritten);
129+
? HPackEncoder.EncodeLiteralHeaderFieldIndexingNewName(name, value, buffer, out bytesWritten)
130+
: HPackEncoder.EncodeLiteralHeaderFieldIndexing(index, value, buffer, out bytesWritten);
131131

132132
if (success)
133133
{

0 commit comments

Comments
 (0)