From d61bce51b37f547dc18d077ed8ce08eec112a6bc Mon Sep 17 00:00:00 2001 From: rtkay123 Date: Sat, 28 Mar 2026 22:58:10 +0200 Subject: feat: timeout from config --- warden/src/config/cli/mod.rs | 9 +++++++++ warden/src/config/mod.rs | 9 +++++++++ warden/src/main.rs | 2 +- warden/src/server/mod.rs | 5 +++-- warden/src/server/routes/mod.rs | 13 ++++++++++--- 5 files changed, 32 insertions(+), 6 deletions(-) diff --git a/warden/src/config/cli/mod.rs b/warden/src/config/cli/mod.rs index 0cf93c5..7acf078 100644 --- a/warden/src/config/cli/mod.rs +++ b/warden/src/config/cli/mod.rs @@ -44,6 +44,14 @@ pub struct Server { /// Log file directory (defaults to temp_dir) #[arg(long, value_name = "DIR", env = "LOGS_DIR")] pub log_dir: Option, + /// Request timeout duration in seconds + #[arg( + long, + value_name = "TIMEOUT_DURATION", + env = "TIMEOUT_DURATION_SECS", + default_value = "5" + )] + pub timeout_secs: Option, } impl Default for Server { @@ -56,6 +64,7 @@ impl Default for Server { env!("CARGO_CRATE_NAME") )), log_dir: Some(std::env::temp_dir()), + timeout_secs: Some(5), } } } diff --git a/warden/src/config/mod.rs b/warden/src/config/mod.rs index 7766982..40e142f 100644 --- a/warden/src/config/mod.rs +++ b/warden/src/config/mod.rs @@ -39,6 +39,7 @@ pub struct Server { pub environment: Environment, pub log_level: EnvFilter, pub log_dir: PathBuf, + pub timeout_secs: u64, } impl Default for Server { @@ -56,6 +57,7 @@ impl Default for Server { .into() }), log_dir: std::env::temp_dir(), + timeout_secs: 5, } } } @@ -69,6 +71,12 @@ impl Configuration { missing.push("server.port"); } + let timeout = cli + .server + .timeout_secs + .or(file.server.timeout_secs) + .unwrap_or(5); + let log_dir = cli .server .log_dir @@ -114,6 +122,7 @@ impl Configuration { environment, log_level: log_level.into(), log_dir, + timeout_secs: timeout, }, }) } diff --git a/warden/src/main.rs b/warden/src/main.rs index 8cadcef..9abc8aa 100644 --- a/warden/src/main.rs +++ b/warden/src/main.rs @@ -39,7 +39,7 @@ async fn main() -> anyhow::Result<()> { let (log_handle, _guard) = logging::initialise_logging(&config.server.log_level, &config.server.log_dir); - let app = server::router(Arc::new(AppState::new(log_handle))).await; + let app = server::router(Arc::new(AppState::new(log_handle)), &config).await; let addr = SocketAddr::from((Ipv6Addr::UNSPECIFIED, config.server.port)); info!(port = addr.port(), "starting server"); diff --git a/warden/src/server/mod.rs b/warden/src/server/mod.rs index eb1ecd2..122efbc 100644 --- a/warden/src/server/mod.rs +++ b/warden/src/server/mod.rs @@ -15,6 +15,7 @@ use utoipa::OpenApi; use utoipa_axum::router::OpenApiRouter; use crate::{ + config::Configuration, server::{ middleware::request_id::{REQUEST_ID_HEADER, middleware_request_id}, routes::{ApiDoc, config::ConfigDoc}, @@ -27,7 +28,7 @@ pub mod error; pub mod middleware; pub mod routes; -pub async fn router(state: Arc) -> Router<()> { +pub async fn router(state: Arc, config: &Configuration) -> Router<()> { let mut doc = ApiDoc::openapi(); doc.merge(ConfigDoc::openapi()); @@ -81,7 +82,7 @@ pub async fn router(state: Arc) -> Router<()> { ) .layer(TimeoutLayer::with_status_code( StatusCode::REQUEST_TIMEOUT, - Duration::from_secs(5), + Duration::from_secs(config.server.timeout_secs), )) .layer(PropagateRequestIdLayer::new(HeaderName::from_static( REQUEST_ID_HEADER, diff --git a/warden/src/server/routes/mod.rs b/warden/src/server/routes/mod.rs index be37e37..a9fba3c 100644 --- a/warden/src/server/routes/mod.rs +++ b/warden/src/server/routes/mod.rs @@ -17,9 +17,16 @@ pub(super) struct ApiDoc; method(get, head), path = "/api/health", responses( - (status = OK, description = "Success", body = str, content_type = "text/plain") - )) -] + ( + status = OK, description = "Warden is live", + body = Option, content_type = "text/plain", + headers( + ("x-request-id" = String, description = "Request identifier") + ) + ) + ), + tag = env!("CARGO_PKG_NAME"), +)] pub async fn health() -> impl IntoResponse { let name = env!("CARGO_PKG_NAME"); let ver = env!("CARGO_PKG_VERSION"); -- cgit v1.2.3