diff --git a/examples/hello-world.rs b/examples/hello-world.rs
new file mode 100644
index 0000000..b351b2f
--- /dev/null
+++ b/examples/hello-world.rs
@@ -0,0 +1,23 @@
+use http::{Request, Response};
+use hyper::Body;
+use ratpack::{app::App, compose_handler, handler::Params, HTTPResult, ServerError};
+
+async fn hello(req: Request
, _resp: Option>, params: Params) -> HTTPResult {
+ let name = params.get("name").unwrap();
+ let bytes = Body::from(format!("hello, {}\n", name));
+
+ return Ok((
+ req,
+ Some(Response::builder().status(200).body(bytes).unwrap()),
+ ));
+}
+
+#[tokio::main]
+async fn main() -> Result<(), ServerError> {
+ let mut app = App::new();
+ app.get("/:name", compose_handler!(hello));
+
+ app.serve("127.0.0.1:3000").await?;
+
+ Ok(())
+}
diff --git a/src/app.rs b/src/app.rs
index ea26827..6230bdd 100644
--- a/src/app.rs
+++ b/src/app.rs
@@ -70,14 +70,16 @@ impl App {
}
}
- pub async fn serve(&'static self, addr: String) -> Result<(), ServerError> {
+ pub async fn serve(self, addr: &str) -> Result<(), ServerError> {
let socketaddr: SocketAddr = addr.parse()?;
- let s = self.clone();
- let sfn = service_fn(move |req: Request| s.dispatch(req));
-
let tcp_listener = TcpListener::bind(socketaddr).await?;
loop {
+ let s = self.clone();
+ let sfn = service_fn(move |req: Request| {
+ let s = s.clone();
+ async move { s.clone().dispatch(req).await }
+ });
let (tcp_stream, _) = tcp_listener.accept().await?;
tokio::task::spawn(async move {
if let Err(http_err) = Http::new()