diff --git a/src/lib.rs b/src/lib.rs index 40594dc..2896c5d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -42,13 +42,12 @@ pub use types::*; pub const REQUEST_URI_MAX_LEN: usize = 1024; pub const GEMINI_PORT: u16 = 1965; -type Handler = Arc HandlerResponse + Send + Sync>; +type Handler = Box HandlerResponse + Send + Sync>; pub (crate) type HandlerResponse = Pin> + Send>>; #[derive(Clone)] pub struct Server { tls_acceptor: TlsAcceptor, - listener: Arc, routes: Arc>, timeout: Duration, complex_timeout: Option, @@ -61,9 +60,9 @@ impl Server { Builder::bind(addr) } - async fn serve(self) -> Result<()> { + async fn serve(self, listener: TcpListener) -> Result<()> { loop { - let (stream, _addr) = self.listener.accept().await + let (stream, _addr) = listener.accept().await .context("Failed to accept client")?; let this = self.clone(); @@ -358,7 +357,7 @@ impl Builder { H: Send + Sync + 'static + Fn(Request) -> F, F: Send + Sync + 'static + Future> { - let wrapped = Arc::new(move|req| Box::pin((handler)(req)) as HandlerResponse); + let wrapped = Box::new(move|req| Box::pin((handler)(req)) as HandlerResponse); self.routes.add_route(path, wrapped); self } @@ -374,7 +373,6 @@ impl Builder { let server = Server { tls_acceptor: TlsAcceptor::from(config), - listener: Arc::new(listener), routes: Arc::new(self.routes), timeout: self.timeout, complex_timeout: self.complex_body_timeout_override, @@ -382,7 +380,7 @@ impl Builder { manager: UserManager::new(self.data_dir)?, }; - server.serve().await + server.serve(listener).await } } diff --git a/src/user_management/routes.rs b/src/user_management/routes.rs index 41ca2ed..2225cb1 100644 --- a/src/user_management/routes.rs +++ b/src/user_management/routes.rs @@ -45,7 +45,7 @@ pub trait UserManagementRoutes: private::Sealed { ) -> Self where UserData: Serialize + DeserializeOwned + 'static + Send + Sync, - Handler: Send + Sync + 'static + Fn(Request, RegisteredUser) -> F, + Handler: Clone + Send + Sync + 'static + Fn(Request, RegisteredUser) -> F, F: Send + Sync + 'static + Future>; } @@ -71,10 +71,9 @@ impl UserManagementRoutes for crate::Builder { ) -> Self where UserData: Serialize + DeserializeOwned + 'static + Send + Sync, - Handler: Send + Sync + 'static + Fn(Request, RegisteredUser) -> F, + Handler: Clone + Send + Sync + 'static + Fn(Request, RegisteredUser) -> F, F: Send + Sync + 'static + Future> { - let handler = std::sync::Arc::new(handler); self.add_route(path, move|request| { let handler = handler.clone(); async move {