Skip to content

Commit 9711c57

Browse files
[main] Update dependencies from dotnet/runtime dotnet/efcore (#42322)
[main] Update dependencies from dotnet/runtime dotnet/efcore - React to runtime changes - Update src/Servers/Kestrel/Transport.Quic/src/Internal/QuicConnectionListener.cs Co-authored-by: Chris Ross <[email protected]> - Update src/Servers/Kestrel/shared/test/TransportTestHelpers/HttpSysHttp3SupportedAttribute.cs Co-authored-by: Chris Ross <[email protected]> - Update src/Servers/Kestrel/shared/test/TransportTestHelpers/MsQuicSupportedAttribute.cs Co-authored-by: Chris Ross <[email protected]> - Update src/Servers/Kestrel/Transport.Quic/src/WebHostBuilderQuicExtensions.cs Co-authored-by: Chris Ross <[email protected]>
1 parent d3290c1 commit 9711c57

11 files changed

+275
-258
lines changed

eng/Version.Details.xml

Lines changed: 138 additions & 138 deletions
Large diffs are not rendered by default.

eng/Versions.props

Lines changed: 69 additions & 69 deletions
Large diffs are not rendered by default.

src/Servers/Kestrel/Transport.Quic/src/Internal/QuicConnectionListener.cs

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -18,43 +18,54 @@ internal sealed class QuicConnectionListener : IMultiplexedConnectionListener, I
1818
private readonly ILogger _log;
1919
private bool _disposed;
2020
private readonly QuicTransportContext _context;
21-
private readonly QuicListener _listener;
21+
private QuicListener? _listener;
22+
private readonly QuicListenerOptions _quicListenerOptions;
2223

2324
public QuicConnectionListener(QuicTransportOptions options, ILogger log, EndPoint endpoint, SslServerAuthenticationOptions sslServerAuthenticationOptions)
2425
{
25-
if (!QuicImplementationProviders.Default.IsSupported)
26+
if (!QuicListener.IsSupported)
2627
{
2728
throw new NotSupportedException("QUIC is not supported or enabled on this platform. See https://aka.ms/aspnet/kestrel/http3reqs for details.");
2829
}
2930

3031
_log = log;
3132
_context = new QuicTransportContext(_log, options);
32-
var quicListenerOptions = new QuicListenerOptions();
33+
_quicListenerOptions = new();
3334

34-
var listenEndPoint = endpoint as IPEndPoint;
35-
36-
if (listenEndPoint == null)
35+
if (endpoint is not IPEndPoint listenEndPoint)
3736
{
3837
throw new InvalidOperationException($"QUIC doesn't support listening on the configured endpoint type. Expected {nameof(IPEndPoint)} but got {endpoint.GetType().Name}.");
3938
}
4039

41-
quicListenerOptions.ServerAuthenticationOptions = sslServerAuthenticationOptions;
42-
quicListenerOptions.ListenEndPoint = listenEndPoint;
43-
quicListenerOptions.IdleTimeout = options.IdleTimeout;
44-
quicListenerOptions.MaxBidirectionalStreams = options.MaxBidirectionalStreamCount;
45-
quicListenerOptions.MaxUnidirectionalStreams = options.MaxUnidirectionalStreamCount;
46-
quicListenerOptions.ListenBacklog = options.Backlog;
40+
_quicListenerOptions.ServerAuthenticationOptions = sslServerAuthenticationOptions;
41+
_quicListenerOptions.ListenEndPoint = listenEndPoint;
42+
_quicListenerOptions.IdleTimeout = options.IdleTimeout;
43+
_quicListenerOptions.MaxBidirectionalStreams = options.MaxBidirectionalStreamCount;
44+
_quicListenerOptions.MaxUnidirectionalStreams = options.MaxUnidirectionalStreamCount;
45+
_quicListenerOptions.ListenBacklog = options.Backlog;
46+
47+
// Setting to listenEndPoint to prevent the property from being null.
48+
// This will be initialized when CreateListenerAsync() is invoked.
49+
EndPoint = listenEndPoint;
50+
}
51+
52+
public EndPoint EndPoint { get; set; }
4753

48-
_listener = new QuicListener(quicListenerOptions);
54+
public async ValueTask CreateListenerAsync()
55+
{
56+
_listener = await QuicListener.ListenAsync(_quicListenerOptions);
4957

5058
// Listener endpoint will resolve an ephemeral port, e.g. 127.0.0.1:0, into the actual port.
5159
EndPoint = _listener.ListenEndPoint;
5260
}
5361

54-
public EndPoint EndPoint { get; set; }
55-
5662
public async ValueTask<MultiplexedConnectionContext?> AcceptAsync(IFeatureCollection? features = null, CancellationToken cancellationToken = default)
5763
{
64+
if (_listener == null)
65+
{
66+
throw new InvalidOperationException($"The listener needs to be initialized by calling {nameof(CreateListenerAsync)}.");
67+
}
68+
5869
try
5970
{
6071
var quicConnection = await _listener.AcceptConnectionAsync(cancellationToken);
@@ -66,7 +77,7 @@ public QuicConnectionListener(QuicTransportOptions options, ILogger log, EndPoin
6677
}
6778
catch (QuicOperationAbortedException ex)
6879
{
69-
_log.LogDebug($"Listener has aborted with exception: {ex.Message}");
80+
_log.LogDebug("Listener has aborted with exception: {Message}", ex.Message);
7081
}
7182
return null;
7283
}
@@ -83,7 +94,7 @@ public ValueTask DisposeAsync()
8394
return ValueTask.CompletedTask;
8495
}
8596

86-
_listener.Dispose();
97+
_listener?.Dispose();
8798
_disposed = true;
8899

89100
return ValueTask.CompletedTask;

src/Servers/Kestrel/Transport.Quic/src/QuicConnectionFactory.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,11 @@ public async ValueTask<MultiplexedConnectionContext> ConnectAsync(EndPoint endPo
3737
}
3838

3939
var sslOptions = features?.Get<SslClientAuthenticationOptions>();
40-
var connection = new QuicConnection(QuicImplementationProviders.MsQuic, (IPEndPoint)endPoint, sslOptions);
40+
var connection = await QuicConnection.ConnectAsync(new QuicClientConnectionOptions()
41+
{
42+
RemoteEndPoint = endPoint,
43+
ClientAuthenticationOptions = sslOptions
44+
}, cancellationToken);
4145

4246
await connection.ConnectAsync(cancellationToken);
4347
return new QuicConnectionContext(connection, _transportContext);

src/Servers/Kestrel/Transport.Quic/src/QuicTransportFactory.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public QuicTransportFactory(ILoggerFactory loggerFactory, IOptions<QuicTransport
4343
/// <param name="features">Additional features to be used to create the listener.</param>
4444
/// <param name="cancellationToken">To cancel the </param>
4545
/// <returns>A </returns>
46-
public ValueTask<IMultiplexedConnectionListener> BindAsync(EndPoint endpoint, IFeatureCollection? features = null, CancellationToken cancellationToken = default)
46+
public async ValueTask<IMultiplexedConnectionListener> BindAsync(EndPoint endpoint, IFeatureCollection? features = null, CancellationToken cancellationToken = default)
4747
{
4848
if (endpoint == null)
4949
{
@@ -66,6 +66,8 @@ public ValueTask<IMultiplexedConnectionListener> BindAsync(EndPoint endpoint, IF
6666
}
6767

6868
var transport = new QuicConnectionListener(_options, _log, endpoint, sslServerAuthenticationOptions);
69-
return new ValueTask<IMultiplexedConnectionListener>(transport);
69+
await transport.CreateListenerAsync();
70+
71+
return transport;
7072
}
7173
}

src/Servers/Kestrel/Transport.Quic/src/WebHostBuilderQuicExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public static class WebHostBuilderQuicExtensions
2020
/// <returns>The <see cref="IWebHostBuilder"/>.</returns>
2121
public static IWebHostBuilder UseQuic(this IWebHostBuilder hostBuilder)
2222
{
23-
if (QuicImplementationProviders.Default.IsSupported)
23+
if (QuicListener.IsSupported)
2424
{
2525
return hostBuilder.ConfigureServices(services =>
2626
{

src/Servers/Kestrel/Transport.Quic/test/QuicConnectionContextTests.cs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public async Task AcceptAsync_CancellationThenAccept_AcceptStreamAfterCancellati
3232

3333
var options = QuicTestHelpers.CreateClientConnectionOptions(connectionListener.EndPoint);
3434

35-
using var clientConnection = new QuicConnection(QuicImplementationProviders.MsQuic, options);
35+
using var clientConnection = await QuicConnection.ConnectAsync(options);
3636
await clientConnection.ConnectAsync().DefaultTimeout();
3737

3838
await using var serverConnection = await acceptTask.DefaultTimeout();
@@ -74,7 +74,7 @@ public async Task AcceptAsync_ClientClosesConnection_ServerNotified()
7474

7575
var options = QuicTestHelpers.CreateClientConnectionOptions(connectionListener.EndPoint);
7676

77-
using var clientConnection = new QuicConnection(QuicImplementationProviders.MsQuic, options);
77+
using var clientConnection = await QuicConnection.ConnectAsync(options);
7878
await clientConnection.ConnectAsync().DefaultTimeout();
7979

8080
await using var serverConnection = await acceptTask.DefaultTimeout();
@@ -100,7 +100,7 @@ public async Task AcceptAsync_ClientStartsAndStopsUnidirectionStream_ServerAccep
100100
await using var connectionListener = await QuicTestHelpers.CreateConnectionListenerFactory(LoggerFactory);
101101

102102
var options = QuicTestHelpers.CreateClientConnectionOptions(connectionListener.EndPoint);
103-
using var quicConnection = new QuicConnection(QuicImplementationProviders.MsQuic, options);
103+
using var quicConnection = await QuicConnection.ConnectAsync(options);
104104
await quicConnection.ConnectAsync().DefaultTimeout();
105105

106106
await using var serverConnection = await connectionListener.AcceptAndAddFeatureAsync().DefaultTimeout();
@@ -143,7 +143,7 @@ public async Task AcceptAsync_ClientStartsAndStopsBidirectionStream_ServerAccept
143143
await using var connectionListener = await QuicTestHelpers.CreateConnectionListenerFactory(LoggerFactory);
144144

145145
var options = QuicTestHelpers.CreateClientConnectionOptions(connectionListener.EndPoint);
146-
using var quicConnection = new QuicConnection(QuicImplementationProviders.MsQuic, options);
146+
using var quicConnection = await QuicConnection.ConnectAsync(options);
147147
await quicConnection.ConnectAsync().DefaultTimeout();
148148

149149
var serverConnection = await connectionListener.AcceptAndAddFeatureAsync().DefaultTimeout();
@@ -194,7 +194,7 @@ public async Task AcceptAsync_ServerStartsAndStopsUnidirectionStream_ClientAccep
194194
await using var connectionListener = await QuicTestHelpers.CreateConnectionListenerFactory(LoggerFactory);
195195

196196
var options = QuicTestHelpers.CreateClientConnectionOptions(connectionListener.EndPoint);
197-
using var quicConnection = new QuicConnection(QuicImplementationProviders.MsQuic, options);
197+
using var quicConnection = await QuicConnection.ConnectAsync(options);
198198
await quicConnection.ConnectAsync().DefaultTimeout();
199199

200200
var serverConnection = await connectionListener.AcceptAndAddFeatureAsync().DefaultTimeout();
@@ -240,7 +240,7 @@ public async Task AcceptAsync_ClientClosesConnection_ExceptionThrown()
240240
await using var connectionListener = await QuicTestHelpers.CreateConnectionListenerFactory(LoggerFactory);
241241

242242
var options = QuicTestHelpers.CreateClientConnectionOptions(connectionListener.EndPoint);
243-
using var quicConnection = new QuicConnection(QuicImplementationProviders.MsQuic, options);
243+
using var quicConnection = await QuicConnection.ConnectAsync(options);
244244
await quicConnection.ConnectAsync().DefaultTimeout();
245245

246246
var serverConnection = await connectionListener.AcceptAndAddFeatureAsync().DefaultTimeout();
@@ -266,7 +266,7 @@ public async Task StreamPool_StreamAbortedOnServer_NotPooled()
266266
await using var connectionListener = await QuicTestHelpers.CreateConnectionListenerFactory(LoggerFactory);
267267

268268
var options = QuicTestHelpers.CreateClientConnectionOptions(connectionListener.EndPoint);
269-
using var clientConnection = new QuicConnection(QuicImplementationProviders.MsQuic, options);
269+
using var clientConnection = await QuicConnection.ConnectAsync(options);
270270
await clientConnection.ConnectAsync().DefaultTimeout();
271271

272272
await using var serverConnection = await connectionListener.AcceptAndAddFeatureAsync().DefaultTimeout();
@@ -310,7 +310,7 @@ public async Task StreamPool_StreamAbortedOnServerAfterComplete_NotPooled()
310310
await using var connectionListener = await QuicTestHelpers.CreateConnectionListenerFactory(LoggerFactory);
311311

312312
var options = QuicTestHelpers.CreateClientConnectionOptions(connectionListener.EndPoint);
313-
using var clientConnection = new QuicConnection(QuicImplementationProviders.MsQuic, options);
313+
using var clientConnection = await QuicConnection.ConnectAsync(options);
314314
await clientConnection.ConnectAsync().DefaultTimeout();
315315

316316
await using var serverConnection = await connectionListener.AcceptAndAddFeatureAsync().DefaultTimeout();
@@ -356,7 +356,7 @@ public async Task StreamPool_StreamAbortedOnClient_NotPooled()
356356
await using var connectionListener = await QuicTestHelpers.CreateConnectionListenerFactory(LoggerFactory);
357357

358358
var options = QuicTestHelpers.CreateClientConnectionOptions(connectionListener.EndPoint);
359-
using var clientConnection = new QuicConnection(QuicImplementationProviders.MsQuic, options);
359+
using var clientConnection = await QuicConnection.ConnectAsync(options);
360360
await clientConnection.ConnectAsync().DefaultTimeout();
361361

362362
await using var serverConnection = await connectionListener.AcceptAndAddFeatureAsync().DefaultTimeout();
@@ -404,7 +404,7 @@ public async Task StreamPool_StreamAbortedOnClientAndServer_NotPooled()
404404
await using var connectionListener = await QuicTestHelpers.CreateConnectionListenerFactory(LoggerFactory);
405405

406406
var options = QuicTestHelpers.CreateClientConnectionOptions(connectionListener.EndPoint);
407-
using var clientConnection = new QuicConnection(QuicImplementationProviders.MsQuic, options);
407+
using var clientConnection = await QuicConnection.ConnectAsync(options);
408408
await clientConnection.ConnectAsync().DefaultTimeout();
409409

410410
await using var serverConnection = await connectionListener.AcceptAndAddFeatureAsync().DefaultTimeout();
@@ -462,7 +462,7 @@ public async Task StreamPool_Heartbeat_ExpiredStreamRemoved()
462462
await using var connectionListener = await QuicTestHelpers.CreateConnectionListenerFactory(LoggerFactory, testSystemClock);
463463

464464
var options = QuicTestHelpers.CreateClientConnectionOptions(connectionListener.EndPoint);
465-
using var clientConnection = new QuicConnection(QuicImplementationProviders.MsQuic, options);
465+
using var clientConnection = await QuicConnection.ConnectAsync(options);
466466
await clientConnection.ConnectAsync().DefaultTimeout();
467467

468468
await using var serverConnection = await connectionListener.AcceptAndAddFeatureAsync().DefaultTimeout();
@@ -517,7 +517,7 @@ public async Task StreamPool_ManyConcurrentStreams_StreamPoolFull()
517517
await using var connectionListener = await QuicTestHelpers.CreateConnectionListenerFactory(LoggerFactory);
518518

519519
var options = QuicTestHelpers.CreateClientConnectionOptions(connectionListener.EndPoint);
520-
using var clientConnection = new QuicConnection(QuicImplementationProviders.MsQuic, options);
520+
using var clientConnection = await QuicConnection.ConnectAsync(options);
521521
await clientConnection.ConnectAsync().DefaultTimeout();
522522

523523
await using var serverConnection = await connectionListener.AcceptAndAddFeatureAsync().DefaultTimeout();
@@ -596,7 +596,7 @@ public async Task PersistentState_StreamsReused_StatePersisted()
596596
await using var connectionListener = await QuicTestHelpers.CreateConnectionListenerFactory(LoggerFactory);
597597

598598
var options = QuicTestHelpers.CreateClientConnectionOptions(connectionListener.EndPoint);
599-
using var clientConnection = new QuicConnection(QuicImplementationProviders.MsQuic, options);
599+
using var clientConnection = await QuicConnection.ConnectAsync(options);
600600
await clientConnection.ConnectAsync().DefaultTimeout();
601601

602602
await using var serverConnection = await connectionListener.AcceptAndAddFeatureAsync().DefaultTimeout();

src/Servers/Kestrel/Transport.Quic/test/QuicConnectionListenerTests.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public async Task AcceptAsync_ClientCreatesConnection_ServerAccepts()
4444

4545
var options = QuicTestHelpers.CreateClientConnectionOptions(connectionListener.EndPoint);
4646

47-
using var clientConnection = new QuicConnection(QuicImplementationProviders.MsQuic, options);
47+
using var clientConnection = await QuicConnection.ConnectAsync(options);
4848
await clientConnection.ConnectAsync().DefaultTimeout();
4949

5050
// Assert
@@ -72,7 +72,7 @@ public async Task ClientCertificate_Required_Sent_Populated()
7272
options.ClientAuthenticationOptions.ClientCertificates = new X509CertificateCollection { testCert };
7373

7474
// Act
75-
using var quicConnection = new QuicConnection(options);
75+
using var quicConnection = await QuicConnection.ConnectAsync(options);
7676
await quicConnection.ConnectAsync().DefaultTimeout();
7777

7878
var serverConnection = await connectionListener.AcceptAndAddFeatureAsync().DefaultTimeout();
@@ -110,7 +110,7 @@ public async Task ClientCertificate_Required_NotSent_ConnectionAborted()
110110
await using var connectionListener = await QuicTestHelpers.CreateConnectionListenerFactory(LoggerFactory, clientCertificateRequired: true);
111111

112112
var options = QuicTestHelpers.CreateClientConnectionOptions(connectionListener.EndPoint);
113-
using var clientConnection = new QuicConnection(options);
113+
using var clientConnection = await QuicConnection.ConnectAsync(options);
114114

115115
var qex = await Assert.ThrowsAnyAsync<QuicException>(async () => await clientConnection.ConnectAsync().DefaultTimeout());
116116
Assert.StartsWith("Connection has been shutdown by transport:", qex.Message);

0 commit comments

Comments
 (0)