Ejemplo n.º 1
0
        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);
            }
        }
Ejemplo n.º 2
0
        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);
            }
        }