diff --git a/src/libraries/Common/tests/System/Net/Http/Http3LoopbackConnection.cs b/src/libraries/Common/tests/System/Net/Http/Http3LoopbackConnection.cs index 9d6fef5fb3a720..fa95952545f686 100644 --- a/src/libraries/Common/tests/System/Net/Http/Http3LoopbackConnection.cs +++ b/src/libraries/Common/tests/System/Net/Http/Http3LoopbackConnection.cs @@ -314,7 +314,7 @@ public async Task WaitForClientDisconnectAsync(bool refuseNewRequests = true) } } - // The client's control stream should throw QuicConnectionAbortedException, indicating that it was + // The client's control stream should throw QuicError.ConnectionAborted, indicating that it was // aborted because the connection was closed (and was not explicitly closed or aborted prior to the connection being closed) QuicException ex = await Assert.ThrowsAsync(async () => await _inboundControlStream.ReadFrameAsync()); Assert.Equal(QuicError.ConnectionAborted, ex.QuicError); diff --git a/src/libraries/System.Net.Quic/src/System/Net/Quic/Implementations/Managed/Internal/Streams/ReceiveStream.cs b/src/libraries/System.Net.Quic/src/System/Net/Quic/Implementations/Managed/Internal/Streams/ReceiveStream.cs index 8a9a0f886d37f2..5653b0219fdf3a 100644 --- a/src/libraries/System.Net.Quic/src/System/Net/Quic/Implementations/Managed/Internal/Streams/ReceiveStream.cs +++ b/src/libraries/System.Net.Quic/src/System/Net/Quic/Implementations/Managed/Internal/Streams/ReceiveStream.cs @@ -455,7 +455,7 @@ private static void ReturnMemory(in StreamChunk chunk) public void OnFatalException(Exception e) { - if (e is QuicConnectionAbortedException abortedException && abortedException.ErrorCode == 0) + if (e is QuicException qe && qe.QuicError == QuicError.ConnectionAborted && abortedException.ErrorCode == 0) { _deliverableChannel.Writer.TryComplete(null); } diff --git a/src/libraries/System.Net.Quic/src/System/Net/Quic/Implementations/Managed/Internal/Tls/MockTls.cs b/src/libraries/System.Net.Quic/src/System/Net/Quic/Implementations/Managed/Internal/Tls/MockTls.cs index 24360b6956ce5a..657d3e57a09d3b 100644 --- a/src/libraries/System.Net.Quic/src/System/Net/Quic/Implementations/Managed/Internal/Tls/MockTls.cs +++ b/src/libraries/System.Net.Quic/src/System/Net/Quic/Implementations/Managed/Internal/Tls/MockTls.cs @@ -50,7 +50,7 @@ public MockTls(ManagedQuicConnection connection, QuicClientConnectionOptions opt WriteLevel = EncryptionLevel.Initial; } - public MockTls(ManagedQuicConnection connection, QuicListenerOptions options, TransportParameters localTransportParams) + public MockTls(ManagedQuicConnection connection, QuicServerConnectionOptions options, TransportParameters localTransportParams) : this(connection, localTransportParams, options.ServerAuthenticationOptions?.ApplicationProtocols) { WriteLevel = EncryptionLevel.Initial; diff --git a/src/libraries/System.Net.Quic/src/System/Net/Quic/Implementations/Managed/Internal/Tls/MockTlsFactory.cs b/src/libraries/System.Net.Quic/src/System/Net/Quic/Implementations/Managed/Internal/Tls/MockTlsFactory.cs index 79f447929fb8db..22442e3d84e3cb 100644 --- a/src/libraries/System.Net.Quic/src/System/Net/Quic/Implementations/Managed/Internal/Tls/MockTlsFactory.cs +++ b/src/libraries/System.Net.Quic/src/System/Net/Quic/Implementations/Managed/Internal/Tls/MockTlsFactory.cs @@ -10,7 +10,7 @@ internal sealed class MockTlsFactory : TlsFactory internal override ITls CreateClient(ManagedQuicConnection connection, QuicClientConnectionOptions options, TransportParameters localTransportParams) => new MockTls(connection, options, localTransportParams); - internal override ITls CreateServer(ManagedQuicConnection connection, QuicListenerOptions options, + internal override ITls CreateServer(ManagedQuicConnection connection, QuicServerConnectionOptions options, TransportParameters localTransportParams) => new MockTls(connection, options, localTransportParams); } } diff --git a/src/libraries/System.Net.Quic/src/System/Net/Quic/Implementations/Managed/Internal/Tls/OpenSsl/OpenSslTls.cs b/src/libraries/System.Net.Quic/src/System/Net/Quic/Implementations/Managed/Internal/Tls/OpenSsl/OpenSslTls.cs index ad4e69a881d7e8..1291fe366f26f4 100644 --- a/src/libraries/System.Net.Quic/src/System/Net/Quic/Implementations/Managed/Internal/Tls/OpenSsl/OpenSslTls.cs +++ b/src/libraries/System.Net.Quic/src/System/Net/Quic/Implementations/Managed/Internal/Tls/OpenSsl/OpenSslTls.cs @@ -102,7 +102,7 @@ internal OpenSslTls(ManagedQuicConnection connection, QuicClientConnectionOption options.ClientAuthenticationOptions?.LocalCertificateSelectionCallback; } - internal OpenSslTls(ManagedQuicConnection connection, QuicListenerOptions options, TransportParameters localTransportParameters) + internal OpenSslTls(ManagedQuicConnection connection, QuicServerConnectionOptions options, TransportParameters localTransportParameters) : this(connection, true, localTransportParameters, diff --git a/src/libraries/System.Net.Quic/src/System/Net/Quic/Implementations/Managed/Internal/Tls/OpenSsl/OpenSslTlsFactory.cs b/src/libraries/System.Net.Quic/src/System/Net/Quic/Implementations/Managed/Internal/Tls/OpenSsl/OpenSslTlsFactory.cs index 51f627630e1ef3..cd08b100009e5e 100644 --- a/src/libraries/System.Net.Quic/src/System/Net/Quic/Implementations/Managed/Internal/Tls/OpenSsl/OpenSslTlsFactory.cs +++ b/src/libraries/System.Net.Quic/src/System/Net/Quic/Implementations/Managed/Internal/Tls/OpenSsl/OpenSslTlsFactory.cs @@ -10,7 +10,7 @@ internal sealed class OpenSslTlsFactory : TlsFactory internal override ITls CreateClient(ManagedQuicConnection connection, QuicClientConnectionOptions options, TransportParameters localTransportParams) => new OpenSslTls(connection, options, localTransportParams); - internal override ITls CreateServer(ManagedQuicConnection connection, QuicListenerOptions options, + internal override ITls CreateServer(ManagedQuicConnection connection, QuicServerConnectionOptions options, TransportParameters localTransportParams) => new OpenSslTls(connection, options, localTransportParams); } } diff --git a/src/libraries/System.Net.Quic/src/System/Net/Quic/Implementations/Managed/Internal/Tls/TlsFactory.cs b/src/libraries/System.Net.Quic/src/System/Net/Quic/Implementations/Managed/Internal/Tls/TlsFactory.cs index 07ec0391435fb3..e5a6500c12f4e2 100644 --- a/src/libraries/System.Net.Quic/src/System/Net/Quic/Implementations/Managed/Internal/Tls/TlsFactory.cs +++ b/src/libraries/System.Net.Quic/src/System/Net/Quic/Implementations/Managed/Internal/Tls/TlsFactory.cs @@ -8,7 +8,7 @@ internal abstract class TlsFactory internal abstract ITls CreateClient(ManagedQuicConnection connection, QuicClientConnectionOptions options, TransportParameters localTransportParams); - internal abstract ITls CreateServer(ManagedQuicConnection connection, QuicListenerOptions options, + internal abstract ITls CreateServer(ManagedQuicConnection connection, QuicServerConnectionOptions options, TransportParameters localTransportParams); } } diff --git a/src/libraries/System.Net.Quic/src/System/Net/Quic/Implementations/Managed/Internal/TransportParameters.cs b/src/libraries/System.Net.Quic/src/System/Net/Quic/Implementations/Managed/Internal/TransportParameters.cs index 9396b2352c9dd7..b28a6d45fe36b2 100644 --- a/src/libraries/System.Net.Quic/src/System/Net/Quic/Implementations/Managed/Internal/TransportParameters.cs +++ b/src/libraries/System.Net.Quic/src/System/Net/Quic/Implementations/Managed/Internal/TransportParameters.cs @@ -47,12 +47,7 @@ private static TransportParameters Create(long maxBidiStreams, long maxUniStream }; } - internal static TransportParameters FromClientConnectionOptions(QuicClientConnectionOptions options) - { - return Create(options.MaxBidirectionalStreams, options.MaxUnidirectionalStreams, options.IdleTimeout); - } - - internal static TransportParameters FromListenerOptions(QuicListenerOptions options) + internal static TransportParameters FromConnectionOptions(QuicConnectionOptions options) { return Create(options.MaxBidirectionalStreams, options.MaxUnidirectionalStreams, options.IdleTimeout); } diff --git a/src/libraries/System.Net.Quic/src/System/Net/Quic/Implementations/Managed/ManagedQuicConnection.cs b/src/libraries/System.Net.Quic/src/System/Net/Quic/Implementations/Managed/ManagedQuicConnection.cs index 4a6cfd8b7661bf..be552da3b05250 100644 --- a/src/libraries/System.Net.Quic/src/System/Net/Quic/Implementations/Managed/ManagedQuicConnection.cs +++ b/src/libraries/System.Net.Quic/src/System/Net/Quic/Implementations/Managed/ManagedQuicConnection.cs @@ -23,7 +23,7 @@ namespace System.Net.Quic.Implementations.Managed { - public sealed partial class ManagedQuicConnection : QuicConnectionProvider + public sealed partial class ManagedQuicConnection : IAsyncDisposable { // This limit should ensure that if we can fit at least an ack frame into the packet, private const int RequiredAllowanceForSending = 2 * ConnectionId.MaximumLength + 40; @@ -225,14 +225,14 @@ internal void Ping() internal EndPoint UnsafeRemoteEndPoint => _remoteEndpoint; // client constructor - public ManagedQuicConnection(QuicClientConnectionOptions options, TlsFactory tlsFactory) + internal ManagedQuicConnection(QuicClientConnectionOptions options, TlsFactory tlsFactory) { IsServer = false; _remoteEndpoint = options.RemoteEndPoint!; _socketContext = new SingleConnectionSocketContext(options.LocalEndPoint, _remoteEndpoint, this) .ConnectionContext; - _localTransportParameters = TransportParameters.FromClientConnectionOptions(options); + _localTransportParameters = TransportParameters.FromConnectionOptions(options); Tls = tlsFactory.CreateClient(this, options, _localTransportParameters); // init random connection ids for the client @@ -252,13 +252,13 @@ public ManagedQuicConnection(QuicClientConnectionOptions options, TlsFactory tls } // server constructor - public ManagedQuicConnection(QuicListenerOptions options, QuicConnectionContext socketContext, + internal ManagedQuicConnection(QuicServerConnectionOptions options, QuicConnectionContext socketContext, EndPoint remoteEndpoint, ReadOnlySpan odcid, TlsFactory tlsFactory) { IsServer = true; _socketContext = socketContext; _remoteEndpoint = remoteEndpoint; - _localTransportParameters = TransportParameters.FromListenerOptions(options); + _localTransportParameters = TransportParameters.FromConnectionOptions(options); Tls = tlsFactory.CreateServer(this, options, _localTransportParameters); _trace = InitTrace(IsServer, odcid); @@ -297,12 +297,12 @@ private void CoreInit() /// /// Connection ID used by this endpoint to identify packets for this connection. /// - public ConnectionId? SourceConnectionId { get; private set; } + internal ConnectionId? SourceConnectionId { get; private set; } /// /// Connection ID used by the peer to identify packets for this connection. /// - public ConnectionId? DestinationConnectionId { get; private set; } + internal ConnectionId? DestinationConnectionId { get; private set; } /// /// Sets new socket context that will from now on service the connection. @@ -607,7 +607,7 @@ internal ValueTask DisposeAsync(long errorCode) if (!Connected) { // abandon connection attempt - _connectTcs.TryCompleteException(new QuicConnectionAbortedException(errorCode)); + _connectTcs.TryCompleteException(new QuicException(QuicError.ConnectionAborted, errorCode)); _closeTcs.TryComplete(); return default; } @@ -626,18 +626,11 @@ internal ValueTask DisposeAsync(long errorCode) return _closeTcs.GetTask(); } - internal ValueTask DisposeAsync() + public ValueTask DisposeAsync() { return DisposeAsync((long)TransportErrorCode.NoError); } - public override void Dispose() - { - // TODO-RZ: I don't like this, but there does not seem to be a better way, unless we just want to do - // fire-and-forget - DisposeAsync().AsTask().ConfigureAwait(false).GetAwaiter().GetResult(); - } - private void SetEncryptionSecrets(EncryptionLevel level, TlsCipherSuite algorithm, ReadOnlySpan readSecret, ReadOnlySpan writeSecret) { @@ -704,14 +697,13 @@ private enum ProcessPacketResult #region Public API - internal override bool Connected => HandshakeConfirmed; - internal override IPEndPoint LocalEndPoint => _socketContext.LocalEndPoint; + public IPEndPoint LocalEndPoint => _socketContext.LocalEndPoint; // TODO-RZ: create a defensive copy of the endpoint - internal override EndPoint RemoteEndPoint => _remoteEndpoint; + public EndPoint RemoteEndPoint => _remoteEndpoint; - internal override ValueTask ConnectAsync(CancellationToken cancellationToken = default) + internal ValueTask ConnectAsync(CancellationToken cancellationToken = default) { ThrowIfDisposed(); ThrowIfError(); @@ -724,39 +716,15 @@ internal override ValueTask ConnectAsync(CancellationToken cancellationToken = d return _connectTcs.GetTask(); } - internal async override ValueTask OpenUnidirectionalStreamAsync(CancellationToken cancellationToken = default) - { - ThrowIfDisposed(); - ThrowIfError(); - - return await OpenStream(true, cancellationToken).ConfigureAwait(false); - } - - internal async override ValueTask OpenBidirectionalStreamAsync(CancellationToken cancellationToken = default) - { - ThrowIfDisposed(); - ThrowIfError(); - - return await OpenStream(false, cancellationToken).ConfigureAwait(false); - } - - internal override int GetRemoteAvailableUnidirectionalStreamCount() - { - ThrowIfDisposed(); - ThrowIfError(); - - return checked((int)_sendLimits.MaxStreamsUni); - } - - internal override int GetRemoteAvailableBidirectionalStreamCount() + public async ValueTask OpenOutboundStreamAsync(QuicStreamType type, CancellationToken cancellationToken = default) { ThrowIfDisposed(); ThrowIfError(); - return checked((int)_sendLimits.MaxStreamsBidi); + return await OpenStream(type == QuicStreamType.Unidirectional, cancellationToken).ConfigureAwait(false); } - internal override async ValueTask AcceptStreamAsync(CancellationToken cancellationToken = default) + public async ValueTask AcceptInboundStreamAsync(CancellationToken cancellationToken = default) { ThrowIfDisposed(); ThrowIfError(); @@ -771,7 +739,7 @@ internal override async ValueTask AcceptStreamAsync(Cancella } } - internal override SslApplicationProtocol NegotiatedApplicationProtocol + public SslApplicationProtocol NegotiatedApplicationProtocol { get { @@ -780,9 +748,9 @@ internal override SslApplicationProtocol NegotiatedApplicationProtocol } } - internal override X509Certificate? RemoteCertificate => throw new NotImplementedException(); + public X509Certificate? RemoteCertificate => throw new NotImplementedException(); - internal override ValueTask CloseAsync(long errorCode, CancellationToken cancellationToken = default) + public ValueTask CloseAsync(long errorCode, CancellationToken cancellationToken = default) { return DisposeAsync(errorCode); } @@ -928,12 +896,9 @@ private QuicException MakeOperationAbortedException() : new QuicOperationAbortedException(); // initiated by us } - private static QuicConnectionAbortedException MakeConnectionAbortedException(QuicError error) + private static QuicException MakeConnectionAbortedException(QuicError error) { - return error.ReasonPhrase != null - // TODO-RZ: We should probably format reason phrase into the exception message - ? new QuicConnectionAbortedException(error.ReasonPhrase, (long)error.ErrorCode) - : new QuicConnectionAbortedException((long)error.ErrorCode); + return new QuicException(QuicError.ConnectionAborted, (long)error.ErrorCode, error.ReasonPhrase); } internal void OnSocketContextException(Exception e) diff --git a/src/libraries/System.Net.Quic/src/System/Net/Quic/Implementations/Managed/ManagedQuicStream.cs b/src/libraries/System.Net.Quic/src/System/Net/Quic/Implementations/Managed/ManagedQuicStream.cs index 28ddea3d442b2d..0f60f8407ca775 100644 --- a/src/libraries/System.Net.Quic/src/System/Net/Quic/Implementations/Managed/ManagedQuicStream.cs +++ b/src/libraries/System.Net.Quic/src/System/Net/Quic/Implementations/Managed/ManagedQuicStream.cs @@ -13,7 +13,7 @@ namespace System.Net.Quic.Implementations.Managed { - internal sealed class ManagedQuicStream : QuicStreamProvider + public sealed class ManagedQuicStream { /// /// Node to the linked list of all flushable streams. Should be accessed only by the class. diff --git a/src/libraries/System.Net.Quic/tests/UnitTests/System.Net.Quic.Unit.Tests.csproj b/src/libraries/System.Net.Quic/tests/UnitTests/System.Net.Quic.Unit.Tests.csproj index 5f983a3e1482f6..7141239714b327 100644 --- a/src/libraries/System.Net.Quic/tests/UnitTests/System.Net.Quic.Unit.Tests.csproj +++ b/src/libraries/System.Net.Quic/tests/UnitTests/System.Net.Quic.Unit.Tests.csproj @@ -16,7 +16,6 @@ -