/// <summary>
        /// Handle an message
        /// </summary>
        /// <param name="context">Context unique for this handler instance</param><param name="message">Message to process</param>
        /// <remarks>
        /// All messages that can't be handled MUST be send up the chain using <see cref="M:Griffin.Networking.IPipelineHandlerContext.SendUpstream(Griffin.Networking.IPipelineMessage)"/>.
        /// </remarks>
        public void HandleUpstream(IPipelineHandlerContext context, IPipelineMessage message)
        {
            var headerMsg = message as ReceivedHeader;

            if (headerMsg != null)
            {
                HandleHeader(context, message, headerMsg);
                return;
            }

            if (_packetType == null)
            {
                context.SendUpstream(message);
                return;
            }

            var msg = message as Received;

            if (msg == null)
            {
                context.SendUpstream(message);
                return;
            }


            var bytesToRead = Math.Min(msg.BufferSlice.RemainingLength, _bytesLeft);

            _stream.Write(msg.BufferSlice.Buffer, msg.BufferSlice.Position, bytesToRead);
            msg.BufferSlice.Position += bytesToRead;

            if (_stream.Length == _header.ContentLength)
            {
                _stream.Position = 0;
                var packet = _decoder.Decode(_packetType, _stream);
                _stream.SetLength(0);
                context.SendUpstream(new ReceivedPacket(packet));
                Clear();
                return;
            }

            // There are remaining received bytes.
            context.SendUpstream(msg);
        }