diff --git a/iron/Cargo.toml b/iron/Cargo.toml new file mode 100644 index 0000000..6c33563 --- /dev/null +++ b/iron/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "iron" +version = "0.1.0" +authors = ["Hatter Jiang "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +iron = "0.6.1" +time = "0.2.6" diff --git a/iron/src/main.rs b/iron/src/main.rs new file mode 100644 index 0000000..071fb5d --- /dev/null +++ b/iron/src/main.rs @@ -0,0 +1,38 @@ +use iron::prelude::*; +use iron::{BeforeMiddleware, AfterMiddleware, typemap}; +use std::time::SystemTime; + +struct ResponseTime; + +impl typemap::Key for ResponseTime { type Value = u128; } + +impl BeforeMiddleware for ResponseTime { + fn before(&self, req: &mut Request) -> IronResult<()> { + req.extensions.insert::(get_time_in_nanos()); + Ok(()) + } +} + +impl AfterMiddleware for ResponseTime { + fn after(&self, req: &mut Request, res: Response) -> IronResult { + let delta = get_time_in_nanos() - *req.extensions.get::().unwrap(); + println!("Request: {}, took: {} ms", req.url, (delta as f64) / 1000000.0); + Ok(res) + } +} + +fn get_time_in_nanos() -> u128 { + SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap().as_nanos() +} + +fn hello_world(_: &mut Request) -> IronResult { + Ok(Response::with((iron::status::Ok, "Hello World\n"))) +} + +fn main() { + let mut chain = Chain::new(hello_world); + chain.link_before(ResponseTime); + chain.link_after(ResponseTime); + println!("Listen on: 127.0.0.1:8080"); + Iron::new(chain).http("127.0.0.1:8080").unwrap(); +}