/// <summary>
 /// Serialize a message into something that can be transported over the socket.
 /// </summary>
 /// <param name="message">Message to serialize</param>
 /// <param name="writer">Buffer used to store the message</param>
 public void Serialize(object message, IBufferWriter writer)
 {
     var msg = (IResponse) message;
     var serializer = new HttpHeaderSerializer();
     serializer.SerializeResponse(msg, writer);
     writer.Copy(msg.Body);
 }
Exemplo n.º 2
0
        /// <summary>
        /// Send a HTTP message
        /// </summary>
        /// <param name="message">Message to send</param>
        public void Send(IMessage message)
        {
            if (message == null) throw new ArgumentNullException("message");
            var slice = _stack.Pop();
            var stream = new SliceStream(slice);
            var serializer = new HttpHeaderSerializer();
            serializer.SerializeResponse((IResponse) message, stream);
            Context.Send(slice, (int) stream.Length);
            if (message.ContentLength > 0 && message.Body == null)
                throw new InvalidOperationException("A content length is specified, but the Body stream is null.");

            if (message.Body != null)
                Context.Send(message.Body);

            if (message.ProtocolVersion == "HTTP/1.0")
                Context.Close();
        }
        /// <summary>
        /// Process message
        /// </summary>
        /// <param name="context"></param>
        /// <param name="message"></param>
        public void HandleDownstream(IPipelineHandlerContext context, IPipelineMessage message)
        {
            var msg = message as SendHttpResponse;
            if (msg == null)
            {
                context.SendDownstream(message);
                return;
            }

            var slice = _pool.Pop();
            var serializer = new HttpHeaderSerializer();
            var stream = new SliceStream(slice);
            serializer.SerializeResponse(msg.Response, stream);
            context.SendDownstream(new SendSlice(slice, (int) stream.Length));
            if (msg.Response.Body != null)
                context.SendDownstream(new SendStream(msg.Response.Body));

            if (!msg.Response.KeepAlive)
                context.SendDownstream(new Close());
        }