use rotor_stream::Buf;
use message::{MessageState, Message, HeaderError};
use version::Version;
pub const NOT_IMPLEMENTED: &'static str = concat!(
"HTTP/1.0 501 Not Implemented\r\n",
"Content-Type: text/plain\r\n",
"Content-Length: 21\r\n",
"\r\n",
"501 Not Implemented\r\n",
);
pub const NOT_IMPLEMENTED_HEAD: &'static str = concat!(
"HTTP/1.0 501 Not Implemented\r\n",
"Content-Type: text/plain\r\n",
"Content-Length: 21\r\n",
"\r\n",
);
pub struct Response<'a>(Message<'a>);
impl<'a> From<Message<'a>> for Response<'a> {
fn from(msg: Message) -> Response {
Response(msg)
}
}
impl<'a> Response<'a> {
pub fn new(out_buf: &mut Buf, version: Version,
is_head: bool, do_close: bool) -> Response
{
use message::Body::*;
MessageState::ResponseStart {
body: if is_head { Ignored } else { Normal },
version: version,
close: do_close || version == Version::Http10,
}.with(out_buf)
}
pub fn finish(self) -> bool {
use message::MessageState::*;
use message::Body::*;
if self.is_complete() {
return true;
}
let (buf, me) = self.0.decompose();
match me {
ResponseStart { body: Denied, .. }
| ResponseStart { body: Ignored, .. }
=> {
buf.extend(NOT_IMPLEMENTED_HEAD.as_bytes());
}
ResponseStart { body: Normal, .. } => {
buf.extend(NOT_IMPLEMENTED.as_bytes());
}
_ => {}
}
return false;
}
pub fn response_continue(&mut self) {
self.0.response_continue()
}
pub fn status(&mut self, code: u16, reason: &str) {
self.0.response_status(code, reason)
}
pub fn add_header(&mut self, name: &str, value: &[u8])
-> Result<(), HeaderError>
{
self.0.add_header(name, value)
}
pub fn add_length(&mut self, n: u64)
-> Result<(), HeaderError>
{
self.0.add_length(n)
}
pub fn add_chunked(&mut self)
-> Result<(), HeaderError>
{
self.0.add_chunked()
}
pub fn is_started(&self) -> bool {
self.0.is_started()
}
pub fn done_headers(&mut self) -> Result<bool, HeaderError> {
self.0.done_headers()
}
pub fn write_body(&mut self, data: &[u8]) {
self.0.write_body(data)
}
pub fn is_complete(&self) -> bool {
self.0.is_complete()
}
pub fn done(&mut self) {
self.0.done()
}
}
pub fn state(resp: Response) -> MessageState {
resp.0.state()
}