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
extern crate iron; extern crate uuid; use iron::IronResult; use iron::error::IronError; use iron::middleware::{BeforeMiddleware, AfterMiddleware}; use iron::request::Request; use iron::response::Response; use iron::typemap::Key; use uuid::Uuid; pub struct RequestId { } impl Key for RequestId { type Value = Uuid; } pub struct RequestIds { } impl RequestIds { pub fn new() -> (RequestIds, RequestIds) { (RequestIds {}, RequestIds {}) } } impl BeforeMiddleware for RequestIds { fn before(&self, request: &mut Request) -> IronResult<()> { request.extensions.insert::<RequestId>(Uuid::new_v4()); Ok(()) } fn catch(&self, request: &mut Request, err: IronError) -> IronResult<()> { request.extensions.remove::<RequestId>(); Err(err) } } impl AfterMiddleware for RequestIds { fn after(&self, request: &mut Request, res: Response) -> IronResult<Response> { request.extensions.remove::<RequestId>(); Ok(res) } fn catch(&self, request: &mut Request, err: IronError) -> IronResult<Response> { request.extensions.remove::<RequestId>(); Err(err) } }