diff --git a/examples/expect-continue.rs b/examples/expect-continue.rs index e2b9e6b..65d8a05 100644 --- a/examples/expect-continue.rs +++ b/examples/expect-continue.rs @@ -12,14 +12,14 @@ 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!") .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/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)) + }) +} diff --git a/src/server.rs b/src/server.rs index 718ab35..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, @@ -95,23 +95,23 @@ 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 { + fn should_continue(&mut self, _: &IncomingRequest) -> StatusCode { StatusCode::CONTINUE } } 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()));