Skip to content

Commit 6468942

Browse files
authored
Add SslApplicationProtocol.Http3 (#56775)
* Add SslApplicationProtocol.Http3 Fix #1293 * Add XML doc * Reuse in Http3Connection * Reuse in tests * HTTP/3 has no negotiation * Use SslApplicationProtocol.Http3.ToString() in tests * Ascending order in ref
1 parent 2360161 commit 6468942

File tree

9 files changed

+15
-22
lines changed

9 files changed

+15
-22
lines changed

src/libraries/Common/tests/System/Net/Http/Http3LoopbackServer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ public Http3Options()
130130
{
131131
MaxUnidirectionalStreams = 100;
132132
MaxBidirectionalStreams = 100;
133-
Alpn = "h3";
133+
Alpn = SslApplicationProtocol.Http3.ToString();
134134
}
135135
}
136136
}

src/libraries/System.Net.Http/src/System/Net/Http/SocketsHttpHandler/Http3Connection.cs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,6 @@ namespace System.Net.Http
2020
[SupportedOSPlatform("macos")]
2121
internal sealed class Http3Connection : HttpConnectionBase
2222
{
23-
// TODO: once HTTP/3 is standardized, create APIs for this.
24-
public static readonly SslApplicationProtocol Http3ApplicationProtocol = new SslApplicationProtocol("h3");
25-
2623
private readonly HttpConnectionPool _pool;
2724
private readonly HttpAuthority? _origin;
2825
private readonly HttpAuthority _authority;

src/libraries/System.Net.Http/src/System/Net/Http/SocketsHttpHandler/HttpConnectionPool.cs

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -295,21 +295,10 @@ public HttpConnectionPool(HttpConnectionPoolManager poolManager, HttpConnectionK
295295
[SupportedOSPlatformGuard("Windows")]
296296
internal static bool IsHttp3Supported() => (OperatingSystem.IsLinux() && !OperatingSystem.IsAndroid()) || OperatingSystem.IsWindows() || OperatingSystem.IsMacOS();
297297

298-
private static readonly List<SslApplicationProtocol> s_http3ApplicationProtocols = CreateHttp3ApplicationProtocols();
298+
private static readonly List<SslApplicationProtocol> s_http3ApplicationProtocols = new List<SslApplicationProtocol>() { SslApplicationProtocol.Http3 };
299299
private static readonly List<SslApplicationProtocol> s_http2ApplicationProtocols = new List<SslApplicationProtocol>() { SslApplicationProtocol.Http2, SslApplicationProtocol.Http11 };
300300
private static readonly List<SslApplicationProtocol> s_http2OnlyApplicationProtocols = new List<SslApplicationProtocol>() { SslApplicationProtocol.Http2 };
301301

302-
private static List<SslApplicationProtocol> CreateHttp3ApplicationProtocols()
303-
{
304-
if (IsHttp3Supported())
305-
{
306-
// TODO: Once the HTTP/3 versions are part of SslApplicationProtocol, see https://github.com/dotnet/runtime/issues/1293, move this back to field initialization.
307-
return new List<SslApplicationProtocol>() { Http3Connection.Http3ApplicationProtocol };
308-
}
309-
310-
return null!;
311-
}
312-
313302
private static SslClientAuthenticationOptions ConstructSslOptions(HttpConnectionPoolManager poolManager, string sslHostName)
314303
{
315304
Debug.Assert(sslHostName != null);

src/libraries/System.Net.Http/tests/FunctionalTests/HttpClientHandlerTest.Http3.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -639,7 +639,7 @@ public async Task Alpn_H3_Success()
639639
return;
640640
}
641641

642-
var options = new Http3Options() { Alpn = "h3" };
642+
var options = new Http3Options() { Alpn = SslApplicationProtocol.Http3.ToString() };
643643
using Http3LoopbackServer server = CreateHttp3LoopbackServer(options);
644644

645645
using var clientDone = new SemaphoreSlim(0);
@@ -650,7 +650,7 @@ public async Task Alpn_H3_Success()
650650
using Http3LoopbackConnection connection = (Http3LoopbackConnection)await server.EstablishGenericConnectionAsync();
651651

652652
SslApplicationProtocol negotiatedAlpn = ExtractMsQuicNegotiatedAlpn(connection);
653-
Assert.Equal(new SslApplicationProtocol("h3"), negotiatedAlpn);
653+
Assert.Equal(SslApplicationProtocol.Http3, negotiatedAlpn);
654654

655655
using Http3LoopbackStream stream = await connection.AcceptRequestStreamAsync();
656656
await stream.HandleRequestAsync();

src/libraries/System.Net.Http/tests/StressTests/HttpStress/StressServer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ void ConfigureListenOptions(ListenOptions listenOptions)
127127
{
128128
host = host.UseQuic(options =>
129129
{
130-
options.Alpn = "h3";
130+
options.Alpn = SslApplicationProtocol.Http3.ToString();
131131
options.IdleTimeout = TimeSpan.FromMinutes(1);
132132
});
133133
}

src/libraries/System.Net.Security/ref/System.Net.Security.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ public readonly struct SslClientHelloInfo
120120
private readonly int _dummyPrimitive;
121121
public static readonly System.Net.Security.SslApplicationProtocol Http11;
122122
public static readonly System.Net.Security.SslApplicationProtocol Http2;
123+
public static readonly System.Net.Security.SslApplicationProtocol Http3;
123124
public SslApplicationProtocol(byte[] protocol) { throw null; }
124125
public SslApplicationProtocol(string protocol) { throw null; }
125126
public System.ReadOnlyMemory<byte> Protocol { get { throw null; } }

src/libraries/System.Net.Security/src/System/Net/Security/SslApplicationProtocol.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,16 @@ namespace System.Net.Security
1010
public readonly struct SslApplicationProtocol : IEquatable<SslApplicationProtocol>
1111
{
1212
private static readonly Encoding s_utf8 = Encoding.GetEncoding(Encoding.UTF8.CodePage, EncoderFallback.ExceptionFallback, DecoderFallback.ExceptionFallback);
13+
private static readonly byte[] s_http3Utf8 = new byte[] { 0x68, 0x33 }; // "h3"
1314
private static readonly byte[] s_http2Utf8 = new byte[] { 0x68, 0x32 }; // "h2"
1415
private static readonly byte[] s_http11Utf8 = new byte[] { 0x68, 0x74, 0x74, 0x70, 0x2f, 0x31, 0x2e, 0x31 }; // "http/1.1"
1516

1617
// Refer to IANA on ApplicationProtocols: https://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xhtml#alpn-protocol-ids
17-
// h2
18+
/// <summary>Defines a <see cref="SslApplicationProtocol"/> instance for HTTP 3.0.</summary>
19+
public static readonly SslApplicationProtocol Http3 = new SslApplicationProtocol(s_http3Utf8, copy: false);
20+
/// <summary>Defines a <see cref="SslApplicationProtocol"/> instance for HTTP 2.0.</summary>
1821
public static readonly SslApplicationProtocol Http2 = new SslApplicationProtocol(s_http2Utf8, copy: false);
19-
// http/1.1
22+
/// <summary>Defines a <see cref="SslApplicationProtocol"/> instance for HTTP 1.1.</summary>
2023
public static readonly SslApplicationProtocol Http11 = new SslApplicationProtocol(s_http11Utf8, copy: false);
2124

2225
private readonly byte[] _readOnlyProtocol;
@@ -77,6 +80,7 @@ public override string ToString()
7780
{
7881
return
7982
arr is null ? string.Empty :
83+
ReferenceEquals(arr, s_http3Utf8) ? "h3" :
8084
ReferenceEquals(arr, s_http2Utf8) ? "h2" :
8185
ReferenceEquals(arr, s_http11Utf8) ? "http/1.1" :
8286
s_utf8.GetString(arr);

src/libraries/System.Net.Security/tests/UnitTests/SslApplicationProtocolTests.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ public class SslApplicationProtocolTests
1313
[Fact]
1414
public void Constants_Values_AreCorrect()
1515
{
16+
Assert.Equal(new SslApplicationProtocol(new byte[] { 0x68, 0x33 }), SslApplicationProtocol.Http3);
1617
Assert.Equal(new SslApplicationProtocol(new byte[] { 0x68, 0x32 }), SslApplicationProtocol.Http2);
1718
Assert.Equal(new SslApplicationProtocol(new byte[] { 0x68, 0x74, 0x74, 0x70, 0x2f, 0x31, 0x2e, 0x31 }), SslApplicationProtocol.Http11);
1819
}
@@ -75,6 +76,7 @@ public void ToString_Rendering_Succeeds()
7576
{
7677
Assert.Equal("http/1.1", SslApplicationProtocol.Http11.ToString());
7778
Assert.Equal("h2", SslApplicationProtocol.Http2.ToString());
79+
Assert.Equal("h3", SslApplicationProtocol.Http3.ToString());
7880
Assert.Equal("hello", new SslApplicationProtocol("hello").ToString());
7981
Assert.Equal("0x0b 0xee", new SslApplicationProtocol(new byte[] { 0x0B, 0xEE }).ToString());
8082
Assert.Equal(string.Empty, default(SslApplicationProtocol).ToString());

src/libraries/System.Net.Security/tests/UnitTests/SslAuthenticationOptionsTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public void ApplicationProtocols_Get_Set_Succeeds()
4141
Assert.Null(_clientOptions.ApplicationProtocols);
4242
Assert.Null(_serverOptions.ApplicationProtocols);
4343

44-
List<SslApplicationProtocol> applnProtos = new List<SslApplicationProtocol> { SslApplicationProtocol.Http2, SslApplicationProtocol.Http11 };
44+
List<SslApplicationProtocol> applnProtos = new List<SslApplicationProtocol> { SslApplicationProtocol.Http3, SslApplicationProtocol.Http2, SslApplicationProtocol.Http11 };
4545
_clientOptions.ApplicationProtocols = applnProtos;
4646
_serverOptions.ApplicationProtocols = applnProtos;
4747

0 commit comments

Comments
 (0)