150 _state.RemoteCertificateRequired = remoteCertificateRequired;
151 _state.RevocationMode = revocationMode;
152 _state.RemoteCertificateValidationCallback = remoteCertificateValidationCallback;
153 _state.IsServer =
true;
165 _state.ListenerState = listenerState;
175 if (
options.RemoteEndPoint ==
null)
181 _state.RemoteCertificateRequired =
true;
182 if (
options.ClientAuthenticationOptions !=
null)
184 _state.RevocationMode =
options.ClientAuthenticationOptions.CertificateRevocationCheckMode;
185 _state.RemoteCertificateValidationCallback =
options.ClientAuthenticationOptions.RemoteCertificateValidationCallback;
186 _state.TargetHost =
options.ClientAuthenticationOptions.TargetHost;
214 state.Connected =
true;
216 state.ListenerState =
null;
229 state.Connection.SetNegotiatedAlpn(connectionEvent.Data.Connected.NegotiatedAlpn, connectionEvent.Data.Connected.NegotiatedAlpnLength);
230 state.Connection =
null;
231 state.Connected =
true;
232 state.ConnectTcs.SetResult(0u);
233 state.ConnectTcs =
null;
239 if (!
state.Connected &&
state.ConnectTcs !=
null)
241 state.Connection =
null;
242 uint status = connectionEvent.Data.ShutdownInitiatedByTransport.Status;
245 state.ConnectTcs =
null;
247 state.AbortErrorCode = 0
L;
248 state.AcceptQueue.Writer.TryComplete();
254 state.AbortErrorCode = connectionEvent.Data.ShutdownInitiatedByPeer.ErrorCode;
255 state.AcceptQueue.Writer.TryComplete();
261 state.StateGCHandle.Free();
262 if (
state.ListenerState !=
null)
264 if (
state.ListenerState.PendingConnections.TryRemove(
state.Handle.DangerousGetHandle(), out var
value))
268 state.ListenerState =
null;
270 state.Connection =
null;
271 state.ShutdownTcs.SetResult(0u);
272 state.AcceptQueue.Writer.TryComplete();
277 taskCompletionSource =
state.NewUnidirectionalStreamsAvailable;
278 taskCompletionSource2 =
state.NewBidirectionalStreamsAvailable;
279 state.NewUnidirectionalStreamsAvailable =
null;
280 state.NewBidirectionalStreamsAvailable =
null;
290 if (!
state.TryQueueNewStream(safeMsQuicStreamHandle, connectionEvent.Data.PeerStreamStarted.Flags))
292 safeMsQuicStreamHandle.
Dispose();
303 if (connectionEvent.Data.StreamsAvailable.UniDirectionalCount > 0)
305 taskCompletionSource =
state.NewUnidirectionalStreamsAvailable;
306 state.NewUnidirectionalStreamsAvailable =
null;
308 if (connectionEvent.Data.StreamsAvailable.BiDirectionalCount > 0)
310 taskCompletionSource2 =
state.NewBidirectionalStreamsAvailable;
311 state.NewBidirectionalStreamsAvailable =
null;
327 if (connectionEvent.Data.PeerCertificateReceived.PlatformCertificateHandle !=
IntPtr.
Zero)
331 x509Certificate =
new X509Certificate2(connectionEvent.Data.PeerCertificateReceived.PlatformCertificateHandle);
337 if (connectionEvent.Data.PeerCertificateReceived.PlatformCertificateChainHandle !=
IntPtr.
Zero)
340 if (readOnlySpan[0].Length != 0 && readOnlySpan[0].
Buffer !=
null)
348 if (x509Certificate ==
null)
352 System.
Net.
NetEventSource.
Error(
state, $
"{state.TraceId} Remote certificate required, but no remote certificate received",
"HandleEventPeerCertificateReceived");
359 x509Chain.ChainPolicy.RevocationMode =
state.RevocationMode;
362 if (x509Certificate2Collection !=
null && x509Certificate2Collection.
Count > 1)
368 if (!
state.RemoteCertificateRequired)
372 state.RemoteCertificate = x509Certificate;
373 if (
state.RemoteCertificateValidationCallback !=
null)
375 bool success =
state.RemoteCertificateValidationCallback(
state, x509Certificate, x509Chain, sslPolicyErrors);
393 System.
Net.
NetEventSource.
Info(
state, $
"{state.TraceId} Certificate validation for '${x509Certificate?.Subject}' finished with ${sslPolicyErrors}",
"HandleEventPeerCertificateReceived");
395 if (sslPolicyErrors != 0)
431 if (newUnidirectionalStreamsAvailable ==
null)
442 if (remoteAvailableUnidirectionalStreamCount > 0)
457 if (newBidirectionalStreamsAvailable ==
null)
468 if (remoteAvailableBidirectionalStreamCount > 0)
524 _state.Connection =
this;
539 throw new ArgumentException($
"Unsupported remote endpoint type '{_remoteEndPoint.GetType()}'.");
566 _state.Connection =
null;
574 _state.Connection =
this;
581 _state.Connection =
null;
591 byte[]
array =
new byte[alpnLength];
606 return connectionEvent.Type
switch
622 System.
Net.
NetEventSource.
Error(
state, $
"{state.TraceId} Exception occurred during handling {connectionEvent.Type} connection callback: {ex}",
"NativeCallbackHandler");
624 if (
state.ConnectTcs !=
null)
626 state.ConnectTcs.TrySetException(ex);
627 state.Connection =
null;
628 state.ConnectTcs =
null;
652 item.AbortRead(4294967295
L);
656 item.AbortWrite(4294967295
L);
679 _state.Connection =
null;
static void SuppressFinalize(object obj)
static unsafe SslPolicyErrors BuildChainAndVerifyProperties(X509Chain chain, X509Certificate2 remoteCertificate, bool checkCertName, bool isServer, string hostName)
virtual AddressFamily AddressFamily
static bool TryParse([NotNullWhen(true)] string? ipString, [NotNullWhen(true)] out IPAddress? address)
static readonly System.Net.NetEventSource Log
static void Info(object thisOrContextObject, FormattableString formattableString=null, [CallerMemberName] string memberName=null)
static void Error(object thisOrContextObject, FormattableString formattableString, [CallerMemberName] string memberName=null)
static unsafe IPEndPoint INetToIPEndPoint(ref MsQuicNativeMethods.SOCKADDR_INET inetAddress)
static unsafe MsQuicNativeMethods.SOCKADDR_INET IPEndPointToINet(IPEndPoint endpoint)
static unsafe ushort GetUShortParam(MsQuicApi api, SafeHandle nativeObject, QUIC_PARAM_LEVEL level, uint param)
static unsafe MsQuicNativeMethods.SOCKADDR_INET GetINetParam(MsQuicApi api, SafeHandle nativeObject, QUIC_PARAM_LEVEL level, uint param)
static string GetTraceId(SafeMsQuicStreamHandle handle)
static void ThrowIfFailed(uint status, string message=null, Exception innerException=null)
static Exception CreateExceptionForHResult(uint status, string message=null, Exception innerException=null)
static SafeMsQuicConfigurationHandle Create(QuicClientConnectionOptions options)
TaskCompletionSource< uint > ConnectTcs
bool TryQueueNewStream(SafeMsQuicStreamHandle streamHandle, QUIC_STREAM_OPEN_FLAGS flags)
TaskCompletionSource NewBidirectionalStreamsAvailable
RemoteCertificateValidationCallback RemoteCertificateValidationCallback
MsQuicConnection Connection
readonly Channel< MsQuicStream > AcceptQueue
MsQuicListener.State ListenerState
readonly TaskCompletionSource< uint > ShutdownTcs
TaskCompletionSource NewUnidirectionalStreamsAvailable
bool RemoteCertificateRequired
bool TryAddStream(MsQuicStream stream)
X509Certificate RemoteCertificate
X509RevocationMode RevocationMode
SafeMsQuicConnectionHandle Handle
void RemoveStream(MsQuicStream stream)
ValueTask ShutdownAsync(QUIC_CONNECTION_SHUTDOWN_FLAGS Flags, long ErrorCode)
MsQuicConnection(QuicClientConnectionOptions options)
static uint HandleEventStreamsAvailable(State state, ref MsQuicNativeMethods.ConnectionEvent connectionEvent)
unsafe override ValueTask ConnectAsync(CancellationToken cancellationToken=default(CancellationToken))
void SetNegotiatedAlpn(IntPtr alpn, int alpnLength)
override QuicStreamProvider OpenUnidirectionalStream()
override SslApplicationProtocol NegotiatedApplicationProtocol
override ValueTask WaitForAvailableUnidirectionalStreamsAsync(CancellationToken cancellationToken=default(CancellationToken))
override ValueTask WaitForAvailableBidirectionalStreamsAsync(CancellationToken cancellationToken=default(CancellationToken))
override int GetRemoteAvailableBidirectionalStreamCount()
static uint HandleEventShutdownInitiatedByTransport(State state, ref MsQuicNativeMethods.ConnectionEvent connectionEvent)
override IPEndPoint LocalEndPoint
static uint HandleEventShutdownComplete(State state, ref MsQuicNativeMethods.ConnectionEvent connectionEvent)
async Task FlushAcceptQueue()
override QuicStreamProvider OpenBidirectionalStream()
readonly EndPoint _remoteEndPoint
static unsafe uint HandleEventPeerCertificateReceived(State state, ref MsQuicNativeMethods.ConnectionEvent connectionEvent)
override async ValueTask< QuicStreamProvider > AcceptStreamAsync(CancellationToken cancellationToken=default(CancellationToken))
SafeMsQuicConfigurationHandle _configuration
override int GetRemoteAvailableUnidirectionalStreamCount()
override ValueTask CloseAsync(long errorCode, CancellationToken cancellationToken=default(CancellationToken))
override EndPoint RemoteEndPoint
static uint HandleEventNewStream(State state, ref MsQuicNativeMethods.ConnectionEvent connectionEvent)
MsQuicConnection(IPEndPoint localEndPoint, IPEndPoint remoteEndPoint, MsQuicListener.State listenerState, SafeMsQuicConnectionHandle handle, bool remoteCertificateRequired=false, X509RevocationMode revocationMode=X509RevocationMode.Offline, RemoteCertificateValidationCallback remoteCertificateValidationCallback=null, ServerCertificateSelectionCallback serverCertificateSelectionCallback=null)
static readonly MsQuicNativeMethods.ConnectionCallbackDelegate s_connectionDelegate
static uint NativeCallbackHandler(IntPtr connection, IntPtr context, ref MsQuicNativeMethods.ConnectionEvent connectionEvent)
static uint HandleEventConnected(State state, ref MsQuicNativeMethods.ConnectionEvent connectionEvent)
static uint HandleEventShutdownInitiatedByPeer(State state, ref MsQuicNativeMethods.ConnectionEvent connectionEvent)
void Dispose(bool disposing)
IPEndPoint _localEndPoint
override X509Certificate RemoteCertificate
static readonly Oid s_serverAuthOid
SslApplicationProtocol _negotiatedAlpnProtocol
static readonly Oid s_clientAuthOid
readonly ConcurrentDictionary< IntPtr, MsQuicConnection > PendingConnections
readonly Channel< MsQuicConnection > AcceptConnectionQueue
static Exception GetConnectionAbortedException(long errorCode)
static Exception SetCurrentStackTrace(Exception source)
static void Copy(int[] source, int startIndex, IntPtr destination, int length)
static string net_quic_not_connected
static string net_quic_cert_chain_validation
static string Format(string resourceFormat, object p1)
static string net_quic_unsupported_address_family
static string net_quic_cert_custom_validation
void AddRange(X509Certificate2[] certificates)
void Import(byte[] rawData)
X509Certificate2Collection ExtraStore
OidCollection ApplicationPolicy
X509ChainPolicy ChainPolicy
static int Exchange(ref int location1, int value)
void SetException(Exception exception)
new Task< TResult > WaitAsync(CancellationToken cancellationToken)
new TaskAwaiter< TResult > GetAwaiter()
QUIC_CONNECTION_SHUTDOWN_FLAGS
static readonly IntPtr Zero
static IntPtr ToIntPtr(GCHandle value)
static GCHandle Alloc(object? value)
static GCHandle FromIntPtr(IntPtr value)
static ValueTask CompletedTask