/// <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 void HandleDownstream(IPipelineHandlerContext context, IPipelineMessage message) { var msg = message as SendResponse; if (msg == null) { context.SendDownstream(message); return; } var buffer = _bufferPool.PopSlice(); var stream = new BufferPoolStream(_bufferPool, buffer); _encoder.Encode(msg.Response, stream); stream.Position = 0; // send header var header = new byte[6]; header[0] = 1; header[1] = _mapper.GetContentId(msg.Response); var lengthBuffer = BitConverter.GetBytes(buffer.Count); Buffer.BlockCopy(lengthBuffer, 0, header, 2, lengthBuffer.Length); context.SendDownstream(new SendBuffer(header, 0, 6)); // send body context.SendDownstream(new SendStream(stream)); }