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 62 63 64 65 66 67 68 69
use crate::handler::Handler; use crate::internal_prelude::*; use std::net::{TcpListener, ToSocketAddrs}; use std::sync::Arc; use std::task::{Context, Poll}; use futures::future; struct ServerInner { handler: Box<dyn Handler>, } async fn hyper_call(server: &ServerInner, req: HyperRequest) -> Result<HyperResponse> { let req = Request::from_hyper(req); let res = server.handler.handle(req).await?; Ok(res.into_hyper()) } pub struct Server { inner: Arc<ServerInner>, } impl Server { pub fn new(handler: Box<dyn Handler>) -> Self { Self { inner: Arc::new(ServerInner { handler }), } } pub async fn run(self, addr: impl ToSocketAddrs) -> Result<()> { let listener = TcpListener::bind(&addr)?; let builder = HyperServer::from_tcp(listener)?; let hyper_server = builder.serve(self); hyper_server.await?; Ok(()) } } impl hyper::service::Service<HyperRequest> for Server { type Response = HyperResponse; type Error = crate::error::Error; type Future = BoxFuture<'static, Result<Self::Response, Self::Error>>; fn poll_ready(&mut self, _: &mut Context<'_>) -> Poll<Result<(), Self::Error>> { Poll::Ready(Ok(())) } fn call(&mut self, req: HyperRequest) -> Self::Future { let inner = Arc::clone(&self.inner); Box::pin(async move { hyper_call(&*inner, req).await }) } } impl hyper::service::Service<&'_ hyper::server::conn::AddrStream> for Server { type Response = Self; type Error = anyhow::Error; type Future = future::Ready<Result<Self::Response, Self::Error>>; fn poll_ready(&mut self, _: &mut Context<'_>) -> Poll<Result<(), Self::Error>> { Poll::Ready(Ok(())) } fn call(&mut self, _req: &'_ hyper::server::conn::AddrStream) -> Self::Future { future::ready(Ok(Self { inner: Arc::clone(&self.inner), })) } }