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