Implement basic middleware handling
This commit is contained in:
@@ -11,8 +11,7 @@ axum = { version = "0.8.7", features = ["form", "http1", "json", "matched-path",
|
||||
chrono = { version = "0.4.42", features = ["clock", "std", "oldtime", "wasmbind", "serde"] }
|
||||
config = { version = "0.15.19", features = ["toml", "json", "yaml", "ini", "ron", "json5", "convert-case", "async"] }
|
||||
tokio = { version = "1", features = ["fs", "io-util", "io-std", "macros", "net", "parking_lot", "process", "rt", "rt-multi-thread", "signal", "sync", "time", "tracing"] }
|
||||
tower = { version = "0.5.2", features = ["tokio", "tracing"] }
|
||||
tower-http = { version = "0.6.6" }
|
||||
tower = { version = "0.5.2", features = ["tokio", "tracing", "timeout"] }
|
||||
tracing = { version = "0.1.41", features = ["std", "attributes"] }
|
||||
tracing-subscriber = { version = "0.3.20", features = ["smallvec", "fmt", "ansi", "tracing-log", "std", "chrono", "json", "serde", "serde_json", "time", "tracing"] }
|
||||
serde_json = { version = "1.0.145", features = ["std"] }
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
mod configs;
|
||||
mod middlewares;
|
||||
mod routes;
|
||||
mod tasks;
|
||||
|
||||
|
||||
34
apps/api/src/middlewares.rs
Normal file
34
apps/api/src/middlewares.rs
Normal file
@@ -0,0 +1,34 @@
|
||||
use axum::{
|
||||
BoxError, Router,
|
||||
error_handling::HandleErrorLayer,
|
||||
http::{Method, StatusCode, Uri},
|
||||
};
|
||||
use std::time::Duration;
|
||||
use tower::{ServiceBuilder, timeout::TimeoutLayer};
|
||||
|
||||
use tracing::warn;
|
||||
|
||||
pub const TIMEOUT_DURATION_SECS: u64 = 30;
|
||||
|
||||
pub fn apply_root_middleware(router: Router) -> Router {
|
||||
let timeout_layer = TimeoutLayer::new(Duration::from_secs(TIMEOUT_DURATION_SECS));
|
||||
|
||||
let service_builder = ServiceBuilder::new()
|
||||
.layer(HandleErrorLayer::new(handle_timeout_error))
|
||||
.layer(timeout_layer);
|
||||
|
||||
router.layer(service_builder)
|
||||
}
|
||||
|
||||
pub async fn handle_timeout_error(
|
||||
method: Method,
|
||||
uri: Uri,
|
||||
//
|
||||
err: BoxError,
|
||||
) -> (StatusCode, String) {
|
||||
warn!("`{method} {uri}` failed with {err}");
|
||||
(
|
||||
StatusCode::INTERNAL_SERVER_ERROR,
|
||||
"Internal server error".to_string(),
|
||||
)
|
||||
}
|
||||
@@ -1,8 +1,11 @@
|
||||
use std::sync::Arc;
|
||||
|
||||
use axum::Router;
|
||||
use axum::{Extension, Router};
|
||||
use migration::sea_orm::DatabaseConnection;
|
||||
|
||||
use crate::middlewares;
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct AppState {
|
||||
// TODO: remove dead_code allowances when fields are used
|
||||
#[allow(dead_code)]
|
||||
@@ -17,11 +20,12 @@ pub struct AppService {
|
||||
}
|
||||
|
||||
pub fn get_root_router(state: impl Into<Arc<AppState>>) -> Router {
|
||||
let router = Router::new()
|
||||
// TODO: Add routes
|
||||
.with_state(state.into());
|
||||
let mut router = Router::new();
|
||||
|
||||
router = middlewares::apply_root_middleware(router);
|
||||
|
||||
router = router.layer(Extension(state.into()));
|
||||
|
||||
#[allow(clippy::let_and_return)]
|
||||
router
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user