/// <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); }