This repository has been archived by the owner on Oct 28, 2020. It is now read-only.
/
paste.rs
69 lines (60 loc) · 1.8 KB
/
paste.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
extern crate iron;
extern crate redis;
extern crate time;
extern crate typemap;
use std::io::net::ip::Ipv4Addr;
use std::str::from_utf8;
use iron::status;
use iron::{
AfterMiddleware,
BeforeMiddleware,
Chain,
ChainBuilder,
Iron,
Request,
Response,
IronResult,
};
use time::precise_time_ns;
use typemap::Assoc;
fn main() {
// Create a connection to the redis server.
let client = redis::Client::open("redis://127.0.0.1/").unwrap();
let mut conn = client.get_connection().unwrap();
conn.send_command("GET", [redis::StrArg("my_key")]);
match conn.read_response() {
redis::Data(value) => {
println!("Got value: {}", from_utf8(value).unwrap());
},
redis::RedisError(redis::ResponseError, msg) => {
fail!(format!("Redis command failed: {}", msg));
},
_ => {
println!("Failed to get value.");
}
}
// Setup the Iron chain.
let mut chain = ChainBuilder::new(hello_world);
chain.link_before(ResponseTime);
chain.link_after(ResponseTime);
Iron::new(chain).listen(Ipv4Addr(127, 0, 0, 1), 3000);
println!("On 3000");
}
fn hello_world(_: &mut Request) -> IronResult<Response> {
Ok(Response::with(status::Ok, "Hello, world!"))
}
struct ResponseTime;
impl Assoc<u64> for ResponseTime {}
impl BeforeMiddleware for ResponseTime {
fn before(&self, req: &mut Request) -> IronResult<()> {
req.extensions.insert::<ResponseTime, u64>(precise_time_ns());
Ok(())
}
}
impl AfterMiddleware for ResponseTime {
fn after(&self, req: &mut Request, _: &mut Response) -> IronResult<()> {
let delta = precise_time_ns() - *req.extensions.find::<ResponseTime, u64>().unwrap();
println!("Request took: {} ms", (delta as f64) / 1000000.0);
Ok(())
}
}