rocket_response_time/
fairing.rs1use 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}