async Task HandleTransportAsync(IAsyncTransport transport, IHandler handler, object context) { IPrincipal principal = null; if (this.saslSettings != null) { ListenerSaslProfile profile = new ListenerSaslProfile(this); transport = await profile.NegotiateAsync(transport).ConfigureAwait(false); principal = profile.GetPrincipal(); } var connection = new ListenerConnection(this, this.address, handler, transport); if (principal == null) { // SASL principal preferred. If not present, check transport. IAuthenticated authenticated = transport as IAuthenticated; if (authenticated != null) { principal = authenticated.Principal; } } connection.Principal = principal; bool shouldClose = false; lock (this.connections) { if (!this.closed) { connection.Closed += this.OnConnectionClosed; this.connections.Add(connection); } else { shouldClose = true; } } if (shouldClose) { await connection.CloseAsync().ConfigureAwait(false); } else { if (handler != null && handler.CanHandle(EventId.ConnectionAccept)) { handler.Handle(Event.Create(EventId.ConnectionAccept, connection, context: context)); } AsyncPump pump = new AsyncPump(this.BufferManager, transport); pump.Start(connection); } }
async Task HandleTransportAsync(IAsyncTransport transport) { IPrincipal principal = null; if (this.saslSettings != null) { ListenerSaslProfile profile = new ListenerSaslProfile(this); transport = await profile.NegotiateAsync(transport); principal = profile.GetPrincipal(); } IHandler handler = this.HandlerFactory?.Invoke(this); var connection = new ListenerConnection(this, this.address, handler, transport); if (principal == null) { // SASL principal preferred. If not present, check transport. IAuthenticated authenticated = transport as IAuthenticated; if (authenticated != null) { principal = authenticated.Principal; } } connection.Principal = principal; bool shouldClose = false; lock (this.connections) { if (!this.closed) { connection.Closed += this.OnConnectionClosed; this.connections.Add(connection); } else { shouldClose = true; } } if (shouldClose) { await connection.CloseAsync(); } else { AsyncPump pump = new AsyncPump(this.BufferManager, transport); pump.Start(connection); } }