Example #1
0
        /// <inheritdoc/>
        public override void FilterClose(INextFilter nextFilter, IoSession session)
        {
            SslHandler handler = session.GetAttribute <SslHandler>(SSL_HANDLER);

            if (handler == null)
            {
                // The connection might already have closed, or
                // SSL might have not started yet.
                base.FilterClose(nextFilter, session);
                return;
            }

            IWriteFuture future = null;

            try
            {
                future           = InitiateClosure(handler, nextFilter, session);
                future.Complete += (s, e) => base.FilterClose(nextFilter, session);
            }
            finally
            {
                if (future == null)
                {
                    base.FilterClose(nextFilter, session);
                }
            }
        }
Example #2
0
            public override IWriteFuture Flush()
            {
                IQueue <Object> bufferQueue = MessageQueue;
                IWriteFuture    future      = null;

                while (!bufferQueue.IsEmpty)
                {
                    Object encodedMessage = bufferQueue.Dequeue();

                    if (encodedMessage == null)
                    {
                        break;
                    }

                    // Flush only when the buffer has remaining.
                    IoBuffer buf = encodedMessage as IoBuffer;
                    if (buf == null || buf.HasRemaining)
                    {
                        future = new DefaultWriteFuture(_session);
                        _nextFilter.FilterWrite(_session, new EncodedWriteRequest(encodedMessage, future, _destination));
                    }
                }

                if (future == null)
                {
                    // Creates an empty writeRequest containing the destination
                    IWriteRequest writeRequest = new DefaultWriteRequest(DefaultWriteRequest.EmptyMessage, null, _destination);
                    future = DefaultWriteFuture.NewNotWrittenFuture(_session, new NothingWrittenException(writeRequest));
                }

                return(future);
            }
Example #3
0
        private IWriteFuture InitiateClosure(SslHandler handler, INextFilter nextFilter, IoSession session)
        {
            IWriteFuture future = DefaultWriteFuture.NewWrittenFuture(session);

            handler.Destroy();
            return(future);
        }
 public DefaultWriteRequest(Object message, IWriteFuture future, EndPoint destination)
 {
     if (message == null)
         throw new ArgumentNullException("message");
     _message = message;
     _future = future ?? UnusedFuture.Instance;
     _destination = destination;
 }
Example #5
0
 public DefaultWriteRequest(Object message, IWriteFuture future, EndPoint destination)
 {
     if (message == null)
     {
         throw new ArgumentNullException("message");
     }
     _message     = message;
     _future      = future ?? UnusedFuture.Instance;
     _destination = destination;
 }
Example #6
0
 /// <inheritdoc/>
 public override void Flush()
 {
     if (_lastWriteFuture == null)
     {
         return;
     }
     _lastWriteFuture.Await();
     if (!_lastWriteFuture.Written)
     {
         throw new IOException("The bytes could not be written to the session");
     }
     _lastWriteFuture = null;
 }
Example #7
0
        /// <inheritdoc/>
        public override void FilterWrite(INextFilter nextFilter, IoSession session, IWriteRequest writeRequest)
        {
            IoEvent ioe = new IoEvent(IoEventType.Write, session, writeRequest);

            if (_queueHandler.Accept(this, ioe))
            {
                nextFilter.FilterWrite(session, writeRequest);
                IWriteFuture writeFuture = writeRequest.Future;
                if (writeFuture == null)
                {
                    return;
                }

                // We can track the write request only when it has a future.
                _queueHandler.Offered(this, ioe);
                writeFuture.Complete += (s, e) => _queueHandler.Polled(this, ioe);
            }
        }
        /// <summary>
        /// Destroy the session.
        /// </summary>
        protected void Destroy()
        {
            if (_writeRequestQueue != null)
            {
                while (!_writeRequestQueue.IsEmpty(this))
                {
                    IWriteRequest writeRequest = _writeRequestQueue.Poll(this);

                    if (writeRequest != null)
                    {
                        IWriteFuture writeFuture = writeRequest.Future;

                        // The WriteRequest may not always have a future:
                        // the CLOSE_REQUEST and MESSAGE_SENT_REQUEST don't.
                        if (writeFuture != null)
                        {
                            writeFuture.Written = true;
                        }
                    }
                }
            }
        }
Example #9
0
        public void TestAcceptorFilterChain()
        {
            Int32     port        = 1024;
            IoFilter  mockFilter  = new MockFilter();
            IoHandler mockHandler = new MockHandler();

            acceptor.FilterChain.AddLast("mock", mockFilter);
            acceptor.Handler = mockHandler;
            acceptor.Bind(new IPEndPoint(IPAddress.Loopback, port));

            try
            {
                IConnectFuture future = connector.Connect(new IPEndPoint(IPAddress.Loopback, port));
                future.Await();

                IWriteFuture writeFuture = future.Session.Write(IoBuffer.Allocate(16).PutInt32(0).Flip());
                writeFuture.Await();
                Assert.IsTrue(writeFuture.Written);

                future.Session.Close(true);

                for (int i = 0; i < 30; i++)
                {
                    if (result.Length == 2)
                    {
                        break;
                    }
                    Thread.Sleep(100);
                }

                Assert.AreEqual("FH", result);
            }
            finally
            {
                acceptor.Unbind();
            }
        }
Example #10
0
        /// <summary>
        /// Writes the given buffer.
        /// </summary>
        public void Write(IoBuffer buf)
        {
            if (CanRead)
            {
                if (_closed)
                {
                    return;
                }

                lock (_syncRoot)
                {
                    if (_buf.HasRemaining)
                    {
                        _buf.Compact().Put(buf).Flip();
                    }
                    else
                    {
                        _buf.Clear().Put(buf).Flip();
                        Monitor.PulseAll(_syncRoot);
                    }
                }
            }
            else if (CanWrite)
            {
                if (!_session.Connected)
                {
                    throw new IOException("The session has been closed.");
                }

                _lastWriteFuture = _session.Write(buf);
            }
            else
            {
                throw new NotSupportedException();
            }
        }
Example #11
0
 public EncodedWriteRequest(Object encodedMessage, IWriteFuture future, System.Net.EndPoint destination)
     : base(encodedMessage, future, destination)
 {
 }
Example #12
0
 public EncodedWriteRequest(Object encodedMessage, IWriteFuture future, System.Net.EndPoint destination)
     : base(encodedMessage, future, destination)
 { }
Example #13
0
        /// <summary>
        /// Writes the given buffer.
        /// </summary>
        public void Write(IoBuffer buf)
        {
            if (CanRead)
            {
                if (_closed)
                    return;

                lock (_syncRoot)
                {
                    if (_buf.HasRemaining)
                    {
                        _buf.Compact().Put(buf).Flip();
                    }
                    else
                    {
                        _buf.Clear().Put(buf).Flip();
                        Monitor.PulseAll(_syncRoot);
                    }
                }
            }
            else if (CanWrite)
            {
                if (!_session.Connected)
                    throw new IOException("The session has been closed.");

                _lastWriteFuture = _session.Write(buf);
            }
            else
                throw new NotSupportedException();
        }
Example #14
0
 public ProtocolCodecSession()
 {
     _notWrittenFuture = DefaultWriteFuture.NewNotWrittenFuture(this, new NotImplementedException());
     _encoderOutput    = new DummyProtocolEncoderOutput(_notWrittenFuture);
     _decoderOutput    = new DummyProtocolDecoderOutput();
 }
Example #15
0
 /// <inheritdoc/>
 public override void Flush()
 {
     if (_lastWriteFuture == null)
         return;
     _lastWriteFuture.Await();
     if (!_lastWriteFuture.Written)
         throw new IOException("The bytes could not be written to the session");
     _lastWriteFuture = null;
 }
Example #16
0
 public DummyProtocolEncoderOutput(IWriteFuture future)
 {
     _future = future;
 }
 public DummyProtocolEncoderOutput(IWriteFuture future)
 {
     _future = future;
 }
Example #18
0
 public DefaultWriteRequest(Object message, IWriteFuture future)
     : this(message, future, null)
 {
 }
Example #19
0
 public DefaultWriteRequest(Object message, IWriteFuture future)
     : this(message, future, null)
 { }
 public ProtocolCodecSession()
 { 
     _notWrittenFuture = DefaultWriteFuture.NewNotWrittenFuture(this, new NotImplementedException());
     _encoderOutput = new DummyProtocolEncoderOutput(_notWrittenFuture);
     _decoderOutput = new DummyProtocolDecoderOutput();
 }
Example #21
0
        public void TestCloseRequest()
        {
            int port = 1024;
            ExpiringSessionRecycler recycler = new ExpiringSessionRecycler(10, 1);

            MockHandler acceptorHandler  = new MockHandler();
            MockHandler connectorHandler = new MockHandler();

            acceptor.SessionConfig.SetIdleTime(IdleStatus.ReaderIdle, 1);
            acceptor.Handler         = acceptorHandler;
            acceptor.SessionRecycler = recycler;
            acceptor.Bind(new IPEndPoint(IPAddress.Loopback, port));

            try
            {
                connector.Handler = connectorHandler;
                IConnectFuture future = connector.Connect(new IPEndPoint(IPAddress.Loopback, port));
                future.Await();

                // Write whatever to trigger the acceptor.
                future.Session.Write(IoBuffer.Allocate(1)).Await();

                // Make sure the connection is closed before recycler closes it.
                while (acceptorHandler.session == null)
                {
                    Thread.Yield();
                }
                acceptorHandler.session.Close(true);
                Assert.IsTrue(acceptorHandler.session.CloseFuture.Await(3000));

                IoSession oldSession = acceptorHandler.session;

                // Wait until all events are processed and clear the state.
                DateTime startTime = DateTime.Now;
                while (acceptorHandler.result.ToString().Length < 8)
                {
                    Thread.Yield();
                    if ((DateTime.Now - startTime).TotalMilliseconds > 5000)
                    {
                        throw new Exception();
                    }
                }
                acceptorHandler.result.Clear();
                acceptorHandler.session = null;

                // Write whatever to trigger the acceptor again.
                IWriteFuture wf = future.Session.Write(IoBuffer.Allocate(1)).Await();
                Assert.IsTrue(wf.Written);

                // Make sure the connection is closed before recycler closes it.
                while (acceptorHandler.session == null)
                {
                    Thread.Yield();
                }
                acceptorHandler.session.Close(true);
                Assert.IsTrue(acceptorHandler.session.CloseFuture.Await(3000));

                future.Session.Close(true).Await();

                Assert.AreNotSame(oldSession, acceptorHandler.session);
            }
            finally
            {
                acceptor.Unbind();
            }
        }