From 71f7d5e0eb24d489613305d2bbf22927c603dd42 Mon Sep 17 00:00:00 2001 From: Peter Majchrak Date: Thu, 23 Jan 2025 20:38:06 +0100 Subject: [PATCH 1/3] 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())); From 00491369de5f0c8ff3e41f1503e51688dd02b585 Mon Sep 17 00:00:00 2001 From: Rodrigo Navarro Date: Tue, 28 Jan 2025 19:17:11 -0300 Subject: [PATCH 2/3] Fixing doc tests --- examples/expect-continue.rs | 2 +- src/server.rs | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/expect-continue.rs b/examples/expect-continue.rs index 0e36cad..65d8a05 100644 --- a/examples/expect-continue.rs +++ b/examples/expect-continue.rs @@ -19,7 +19,7 @@ impl Service for UploadService { .unwrap()) } - fn should_continue(&self, req: &Request) -> StatusCode { + fn should_continue(&mut self, req: &Request) -> StatusCode { match req.headers().typed_get::() { Some(len) if len.0 <= self.max_length => StatusCode::CONTINUE, _ => StatusCode::EXPECTATION_FAILED, diff --git a/src/server.rs b/src/server.rs index d4235a8..f485b2e 100644 --- a/src/server.rs +++ b/src/server.rs @@ -72,14 +72,14 @@ type IncomingRequest = Request; /// 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!") /// .unwrap()) /// } /// -/// fn should_continue(&self, req: &Request) -> StatusCode { +/// fn should_continue(&mut self, req: &Request) -> StatusCode { /// match req.headers().typed_get::() { /// Some(len) if len.0 <= self.max_length => StatusCode::CONTINUE, /// _ => StatusCode::EXPECTATION_FAILED, @@ -97,7 +97,7 @@ pub trait Service { fn call(&mut self, request: IncomingRequest) -> Result, Self::Error>; - fn should_continue(&self, _: &IncomingRequest) -> StatusCode { + fn should_continue(&mut self, _: &IncomingRequest) -> StatusCode { StatusCode::CONTINUE } } From 5998195362ff37db583a788cb245081f88e592c7 Mon Sep 17 00:00:00 2001 From: Rodrigo Navarro Date: Tue, 28 Jan 2025 19:22:22 -0300 Subject: [PATCH 3/3] Add single thread example --- examples/single-thread.rs | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 examples/single-thread.rs diff --git a/examples/single-thread.rs b/examples/single-thread.rs new file mode 100644 index 0000000..a44d88b --- /dev/null +++ b/examples/single-thread.rs @@ -0,0 +1,11 @@ +use touche::{Response, Server, StatusCode}; + +fn main() -> std::io::Result<()> { + let mut counter = 0; + Server::bind("0.0.0.0:4444").serve_single_thread(|_| { + counter += 1; + Response::builder() + .status(StatusCode::OK) + .body(format!("Request count: {}", counter)) + }) +}