1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
extern crate bytes; extern crate futures; extern crate httparse; extern crate tokio_codec; extern crate tokio_io; extern crate tokio_proto; extern crate tokio_service; mod request; mod response; use std::io; pub use request::Request; pub use response::Response; use bytes::BytesMut; use futures::future; use tokio_codec::{Decoder, Encoder}; use tokio_io::codec::Framed; use tokio_io::{AsyncRead, AsyncWrite}; use tokio_proto::pipeline::ServerProto; pub use tokio_proto::TcpServer as Server; pub use tokio_service::Service as Handler; pub type SilverResult = future::Ok<Response, io::Error>; pub struct Http; impl<T: AsyncRead + AsyncWrite + 'static> ServerProto<T> for Http { type Request = Request; type Response = Response; type Transport = Framed<T, HttpCodec>; type BindTransport = io::Result<Framed<T, HttpCodec>>; fn bind_transport(&self, io: T) -> io::Result<Framed<T, HttpCodec>> { Ok(io.framed(HttpCodec)) } } pub struct HttpCodec; impl Decoder for HttpCodec { type Item = Request; type Error = io::Error; fn decode(&mut self, buf: &mut BytesMut) -> io::Result<Option<Request>> { request::decode(buf) } } impl Encoder for HttpCodec { type Item = Response; type Error = io::Error; fn encode(&mut self, msg: Response, buf: &mut BytesMut) -> io::Result<()> { response::encode(&msg, buf); Ok(()) } }