/// <summary>
        /// Process message
        /// </summary>
        /// <param name="context"></param>
        /// <param name="message"></param>
        /// <remarks>
        /// Should always call either <see cref="IPipelineHandlerContext.SendDownstream"/> or <see cref="IPipelineHandlerContext.SendUpstream"/>
        /// unless the handler really wants to stop the processing.
        /// </remarks>
        public virtual void HandleDownstream(IPipelineHandlerContext context, IPipelineMessage message)
        {
            var sendBuffer = message as SendBuffer;

            if (sendBuffer != null)
            {
                _context.Send(new BufferSlice(sendBuffer.Buffer, sendBuffer.Offset, sendBuffer.Count), sendBuffer.Count);
                return;
            }

            var sendSlice = message as SendSlice;

            if (sendSlice != null)
            {
                _context.Send(sendSlice.Slice, sendSlice.Length);
                return;
            }

            var send = message as SendStream;

            if (send != null)
            {
                _context.Send(send.Stream);
                return;
            }

            if (message is Disconnect)
            {
                _context.Close();
                return;
            }

            throw new InvalidOperationException("Unsupported pipeline message: " + message);
        }