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()));