use futures::{Async, Poll}; use super::{helpers, HttpHandlerTask, Writer}; use http::{StatusCode, Version}; use Error; pub(crate) struct ServerError(Version, StatusCode); impl ServerError { pub fn err(ver: Version, status: StatusCode) -> Box { Box::new(ServerError(ver, status)) } } impl HttpHandlerTask for ServerError { fn poll_io(&mut self, io: &mut Writer) -> Poll { { let bytes = io.buffer(); // Buffer should have sufficient capacity for status line // and extra space bytes.reserve(helpers::STATUS_LINE_BUF_SIZE + 1); helpers::write_status_line(self.0, self.1.as_u16(), bytes); } // Convert Status Code to Reason. let reason = self.1.canonical_reason().unwrap_or(""); io.buffer().extend_from_slice(reason.as_bytes()); // No response body. io.buffer().extend_from_slice(b"\r\ncontent-length: 0\r\n"); // date header io.set_date(); Ok(Async::Ready(true)) } }