From 71f7d5e0eb24d489613305d2bbf22927c603dd42 Mon Sep 17 00:00:00 2001 From: Peter Majchrak Date: Thu, 23 Jan 2025 20:38:06 +0100 Subject: [PATCH] Make Service::call() take &mut self --- examples/expect-continue.rs | 2 +- src/server.rs | 27 ++++++++++++--------------- 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/examples/expect-continue.rs b/examples/expect-continue.rs index e2b9e6b..0e36cad 100644 --- a/examples/expect-continue.rs +++ b/examples/expect-continue.rs @@ -12,7 +12,7 @@ impl Service for UploadService { type Body = &'static str; type Error = Infallible; - fn call(&self, _req: Request) -> Result, Self::Error> { + fn call(&mut self, _req: Request) -> Result, Self::Error> { Ok(Response::builder() .status(StatusCode::OK) .body("Thanks for the info!") diff --git a/src/server.rs b/src/server.rs index 718ab35..d4235a8 100644 --- a/src/server.rs +++ b/src/server.rs @@ -95,7 +95,7 @@ pub trait Service { type Body: HttpBody; type Error: Into>; - fn call(&self, request: IncomingRequest) -> Result, Self::Error>; + fn call(&mut self, request: IncomingRequest) -> Result, Self::Error>; fn should_continue(&self, _: &IncomingRequest) -> StatusCode { StatusCode::CONTINUE @@ -104,14 +104,14 @@ pub trait Service { impl Service for F where - F: Fn(IncomingRequest) -> Result, Err>, + F: FnMut(IncomingRequest) -> Result, Err>, Body: HttpBody, Err: Into>, { type Body = Body; type Error = Err; - fn call(&self, request: IncomingRequest) -> Result, Self::Error> { + fn call(&mut self, request: IncomingRequest) -> Result, Self::Error> { self(request) } } @@ -163,9 +163,9 @@ impl Server<'_> { S: Send + Clone + 'static, { for conn in self.incoming { - let app = service.clone(); + let mut app = service.clone(); self.thread_pool.execute(move || { - serve(conn, app).ok(); + serve(conn, &mut app).ok(); }); } @@ -187,13 +187,12 @@ impl Server<'_> { /// }) /// # } /// ``` - pub fn serve_single_thread(self, service: S) -> io::Result<()> + pub fn serve_single_thread(self, mut service: S) -> io::Result<()> where - S: Service + Clone, + S: Service, { for conn in self.incoming { - let app = service.clone(); - serve(conn, app).ok(); + serve(conn, &mut service).ok(); } Ok(()) } @@ -221,15 +220,13 @@ impl Server<'_> { /// ``` pub fn make_service(self, make_service: M) -> io::Result<()> where - M: MakeService, - M: Clone + 'static, + M: MakeService + 'static, ::Service: Send, { for conn in self.incoming { - let app = make_service.clone(); - if let Ok(handler) = app.call(&conn) { + if let Ok(mut handler) = make_service.call(&conn) { self.thread_pool.execute(move || { - serve(conn, handler).ok(); + serve(conn, &mut handler).ok(); }); } } @@ -404,7 +401,7 @@ where } } -fn serve, A: Service>(stream: C, app: A) -> io::Result<()> { +fn serve, A: Service>(stream: C, app: &mut A) -> io::Result<()> { let conn = stream.into(); let mut read_queue = ReadQueue::new(BufReader::new(conn.clone()));