From 95b908836e8f6041280934a2122c6c7145db78da Mon Sep 17 00:00:00 2001 From: Philippe Loctaux Date: Tue, 28 Feb 2023 17:24:40 +0100 Subject: [PATCH] added response_timer --- crates/ezidam/src/main.rs | 3 +++ crates/ezidam/src/response_timer.rs | 34 +++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 crates/ezidam/src/response_timer.rs diff --git a/crates/ezidam/src/main.rs b/crates/ezidam/src/main.rs index f881159..0b0ea11 100644 --- a/crates/ezidam/src/main.rs +++ b/crates/ezidam/src/main.rs @@ -7,6 +7,9 @@ async fn main() -> std::result::Result<(), rocket::Error> { // Build server let rocket_builder = rocket::build(); + // Response timer + let rocket_builder = response_timer::ResponseTimer::rocket(rocket_builder); + // Database let rocket_builder = database::Database::rocket(rocket_builder); diff --git a/crates/ezidam/src/response_timer.rs b/crates/ezidam/src/response_timer.rs new file mode 100644 index 0000000..3d00d1f --- /dev/null +++ b/crates/ezidam/src/response_timer.rs @@ -0,0 +1,34 @@ +// Code stolen from https://crates.io/crates/rocket-response-time +// Copyright Thomas Parsley , MIT License + +use rocket::fairing::{Fairing, Kind}; +use rocket::{Build, Request, Rocket}; + +pub struct ResponseTimer {} + +impl ResponseTimer { + pub fn rocket(rocket_builder: Rocket) -> Rocket { + rocket_builder.attach(Self {}) + } +} + +#[rocket::async_trait] +impl Fairing for ResponseTimer { + fn info(&self) -> rocket::fairing::Info { + rocket::fairing::Info { + name: "ResponseTimer", + kind: Kind::Request | Kind::Response, + } + } + + async fn on_request(&self, request: &mut Request<'_>, _: &mut rocket::Data<'_>) { + request.local_cache(std::time::Instant::now); + } + + async fn on_response<'r>(&self, request: &'r Request<'_>, response: &mut rocket::Response<'r>) { + let start_time = request.local_cache(std::time::Instant::now); + let end_time = start_time.elapsed(); + + response.set_raw_header("X-Response-Time", format!("{end_time:.2?}")); + } +}