Make H3StaticTable static class (#21705)
* Update H3StaticTable.cs * Update QPackEncoder.cs * Update Http3TestBase.cs * Update EncoderStreamReader.cs * Update QPackDecoder.cs * Update Http3Stream.cs * Use s_ prefix for static fields
This commit is contained in:
parent
bf099ab594
commit
eab9005e6b
|
|
@ -116,13 +116,13 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http3
|
||||||
|
|
||||||
public void OnStaticIndexedHeader(int index)
|
public void OnStaticIndexedHeader(int index)
|
||||||
{
|
{
|
||||||
var knownHeader = H3StaticTable.Instance[index];
|
var knownHeader = H3StaticTable.GetHeaderFieldAt(index);
|
||||||
OnHeader(knownHeader.Name, knownHeader.Value);
|
OnHeader(knownHeader.Name, knownHeader.Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnStaticIndexedHeader(int index, ReadOnlySpan<byte> value)
|
public void OnStaticIndexedHeader(int index, ReadOnlySpan<byte> value)
|
||||||
{
|
{
|
||||||
var knownHeader = H3StaticTable.Instance[index];
|
var knownHeader = H3StaticTable.GetHeaderFieldAt(index);
|
||||||
OnHeader(knownHeader.Name, value);
|
OnHeader(knownHeader.Name, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -322,7 +322,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http3.QPack
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
return _s ? H3StaticTable.Instance[index] : _dynamicTable[index];
|
return _s ? H3StaticTable.GetHeaderFieldAt(index) : _dynamicTable[index];
|
||||||
}
|
}
|
||||||
catch (IndexOutOfRangeException ex)
|
catch (IndexOutOfRangeException ex)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -355,13 +355,13 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests
|
||||||
|
|
||||||
public void OnStaticIndexedHeader(int index)
|
public void OnStaticIndexedHeader(int index)
|
||||||
{
|
{
|
||||||
var knownHeader = H3StaticTable.Instance[index];
|
var knownHeader = H3StaticTable.GetHeaderFieldAt(index);
|
||||||
_decodedHeaders[((Span<byte>)knownHeader.Name).GetAsciiStringNonNullCharacters()] = HttpUtilities.GetAsciiOrUTF8StringNonNullCharacters(knownHeader.Value);
|
_decodedHeaders[((Span<byte>)knownHeader.Name).GetAsciiStringNonNullCharacters()] = HttpUtilities.GetAsciiOrUTF8StringNonNullCharacters(knownHeader.Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnStaticIndexedHeader(int index, ReadOnlySpan<byte> value)
|
public void OnStaticIndexedHeader(int index, ReadOnlySpan<byte> value)
|
||||||
{
|
{
|
||||||
_decodedHeaders[((Span<byte>)H3StaticTable.Instance[index].Name).GetAsciiStringNonNullCharacters()] = value.GetAsciiOrUTF8StringNonNullCharacters();
|
_decodedHeaders[((Span<byte>)H3StaticTable.GetHeaderFieldAt(index).Name).GetAsciiStringNonNullCharacters()] = value.GetAsciiOrUTF8StringNonNullCharacters();
|
||||||
}
|
}
|
||||||
|
|
||||||
internal async Task WaitForStreamErrorAsync(Http3ErrorCode protocolError, string expectedErrorMessage)
|
internal async Task WaitForStreamErrorAsync(Http3ErrorCode protocolError, string expectedErrorMessage)
|
||||||
|
|
|
||||||
|
|
@ -7,10 +7,9 @@ using System.Text;
|
||||||
|
|
||||||
namespace System.Net.Http.QPack
|
namespace System.Net.Http.QPack
|
||||||
{
|
{
|
||||||
// TODO: make class static.
|
internal static class H3StaticTable
|
||||||
internal class H3StaticTable
|
|
||||||
{
|
{
|
||||||
private readonly Dictionary<int, int> _statusIndex = new Dictionary<int, int>
|
private static readonly Dictionary<int, int> s_statusIndex = new Dictionary<int, int>
|
||||||
{
|
{
|
||||||
[103] = 24,
|
[103] = 24,
|
||||||
[200] = 25,
|
[200] = 25,
|
||||||
|
|
@ -28,7 +27,7 @@ namespace System.Net.Http.QPack
|
||||||
[500] = 71,
|
[500] = 71,
|
||||||
};
|
};
|
||||||
|
|
||||||
private readonly Dictionary<HttpMethod, int> _methodIndex = new Dictionary<HttpMethod, int>
|
private static readonly Dictionary<HttpMethod, int> s_methodIndex = new Dictionary<HttpMethod, int>
|
||||||
{
|
{
|
||||||
// TODO connect is internal to system.net.http
|
// TODO connect is internal to system.net.http
|
||||||
[HttpMethod.Delete] = 16,
|
[HttpMethod.Delete] = 16,
|
||||||
|
|
@ -39,21 +38,15 @@ namespace System.Net.Http.QPack
|
||||||
[HttpMethod.Put] = 21,
|
[HttpMethod.Put] = 21,
|
||||||
};
|
};
|
||||||
|
|
||||||
private H3StaticTable()
|
public static int Count => s_staticTable.Length;
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public static H3StaticTable Instance { get; } = new H3StaticTable();
|
|
||||||
|
|
||||||
public int Count => _staticTable.Length;
|
|
||||||
|
|
||||||
public HeaderField this[int index] => _staticTable[index];
|
|
||||||
|
|
||||||
// TODO: just use Dictionary directly to avoid interface dispatch.
|
// TODO: just use Dictionary directly to avoid interface dispatch.
|
||||||
public IReadOnlyDictionary<int, int> StatusIndex => _statusIndex;
|
public static IReadOnlyDictionary<int, int> StatusIndex => s_statusIndex;
|
||||||
public IReadOnlyDictionary<HttpMethod, int> MethodIndex => _methodIndex;
|
public static IReadOnlyDictionary<HttpMethod, int> MethodIndex => s_methodIndex;
|
||||||
|
|
||||||
private readonly HeaderField[] _staticTable = new HeaderField[]
|
public static HeaderField GetHeaderFieldAt(int index) => s_staticTable[index];
|
||||||
|
|
||||||
|
private static readonly HeaderField[] s_staticTable = new HeaderField[]
|
||||||
{
|
{
|
||||||
CreateHeaderField(":authority", ""), // 0
|
CreateHeaderField(":authority", ""), // 0
|
||||||
CreateHeaderField(":path", "/"), // 1
|
CreateHeaderField(":path", "/"), // 1
|
||||||
|
|
|
||||||
|
|
@ -413,7 +413,7 @@ namespace System.Net.Http.QPack
|
||||||
|
|
||||||
if (_index is int index)
|
if (_index is int index)
|
||||||
{
|
{
|
||||||
Debug.Assert(index >= 0 && index <= H3StaticTable.Instance.Count, $"The index should be a valid static index here. {nameof(QPackDecoder)} should have previously thrown if it read a dynamic index.");
|
Debug.Assert(index >= 0 && index <= H3StaticTable.Count, $"The index should be a valid static index here. {nameof(QPackDecoder)} should have previously thrown if it read a dynamic index.");
|
||||||
handler.OnStaticIndexedHeader(index, headerValueSpan);
|
handler.OnStaticIndexedHeader(index, headerValueSpan);
|
||||||
_index = null;
|
_index = null;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -416,7 +416,7 @@ namespace System.Net.Http.QPack
|
||||||
case 404:
|
case 404:
|
||||||
case 500:
|
case 500:
|
||||||
// TODO this isn't safe, some index can be larger than 64. Encoded here!
|
// TODO this isn't safe, some index can be larger than 64. Encoded here!
|
||||||
buffer[0] = (byte)(0xC0 | H3StaticTable.Instance.StatusIndex[statusCode]);
|
buffer[0] = (byte)(0xC0 | H3StaticTable.StatusIndex[statusCode]);
|
||||||
return 1;
|
return 1;
|
||||||
default:
|
default:
|
||||||
// Send as Literal Header Field Without Indexing - Indexed Name
|
// Send as Literal Header Field Without Indexing - Indexed Name
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue