Ejemplo n.º 1
0
        /// <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());
            }
        }
Ejemplo 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>
        /// 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);
        }
Ejemplo n.º 4
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      = this.stack.Pop();
            var stream     = new SliceStream(slice);
            var serializer = new HttpHeaderSerializer();

            serializer.SerializeResponse((IResponse)message, stream);

            this.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)
            {
                this.Context.Send(message.Body);
            }

            if (message.ProtocolVersion == "HTTP/1.0")
            {
                this.Context.Close();
            }
            else
            {
                //Close connection according to headers
                var connectionHeader = message.Headers["Connection"];
                if (connectionHeader != null && connectionHeader.Value == "close")
                {
                    this.Context.Close();
                }
            }
        }