rocket_response_time/
fairing.rs

1use rocket::{fairing::Fairing, Request};
2
3pub struct ResponseTimer {}
4
5impl ResponseTimer {
6    pub fn new() -> Self {
7        Self {}
8    }
9}
10
11#[rocket::async_trait]
12impl Fairing for ResponseTimer {
13    fn info(&self) -> rocket::fairing::Info {
14        rocket::fairing::Info {
15            name: "ResponseTimer",
16            kind: rocket::fairing::Kind::Request | rocket::fairing::Kind::Response,
17        }
18    }
19
20    async fn on_request(&self, request: &mut Request<'_>, _: &mut rocket::Data<'_>) {
21        request.local_cache(|| std::time::Instant::now());
22    }
23
24    async fn on_response<'r>(&self, request: &'r Request<'_>, response: &mut rocket::Response<'r>) {
25        let start_time = request.local_cache(|| std::time::Instant::now());
26        let end_time = start_time.elapsed();
27
28        response.set_raw_header("X-Response-Time", format!("{:.2?}", end_time));
29    }
30}