async Task HandleTransportAsync(IAsyncTransport transport)
{
IPrincipal principal = null;
if (this.saslSettings != null)
{
ListenerSaslProfile profile = new ListenerSaslProfile(this);
transport = await profile.OpenAsync(null, this.BufferManager, transport);
principal = profile.GetPrincipal();
}
var connection = new ListenerConnection(this, this.address, 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);
}
}