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