use axum::http::{header::AUTHORIZATION, HeaderName, Request};
use std::time::Duration;
use tower_http::{
cors::CorsLayer,
request_id::{MakeRequestId, PropagateRequestIdLayer, RequestId, SetRequestIdLayer},
sensitive_headers::SetSensitiveRequestHeadersLayer,
timeout::TimeoutLayer,
trace::TraceLayer,
};
use uuid::Uuid;
pub const DEFAULT_TIMEOUT_SECS: u64 = 30;
const X_REQUEST_ID: HeaderName = HeaderName::from_static("x-request-id");
#[derive(Clone, Copy)]
pub struct UuidRequestId;
impl MakeRequestId for UuidRequestId {
fn make_request_id<B>(&mut self, _req: &Request<B>) -> Option<RequestId> {
let hv = Uuid::new_v4().to_string().parse().ok()?;
Some(RequestId::new(hv))
}
}
pub fn apply_middleware_stack(router: axum::Router, _service_name: &'static str) -> axum::Router {
router
.layer(CorsLayer::permissive())
.layer(TimeoutLayer::with_status_code(
axum::http::StatusCode::REQUEST_TIMEOUT,
Duration::from_secs(DEFAULT_TIMEOUT_SECS),
))
.layer(PropagateRequestIdLayer::new(X_REQUEST_ID.clone()))
.layer(TraceLayer::new_for_http())
.layer(SetRequestIdLayer::new(X_REQUEST_ID.clone(), UuidRequestId))
.layer(SetSensitiveRequestHeadersLayer::new([AUTHORIZATION]))
}
pub fn middleware_stack_assembles(_service_name: &'static str) -> bool {
let _ = apply_middleware_stack(axum::Router::new(), _service_name);
true
}