add caching header
This commit is contained in:
parent
e43bee9e2e
commit
afc4ba3d4d
1 changed files with 33 additions and 4 deletions
|
@ -1,11 +1,17 @@
|
||||||
use axum::{
|
use axum::{
|
||||||
body::Body,
|
body::Body,
|
||||||
http::{Request, StatusCode},
|
error_handling::HandleErrorLayer,
|
||||||
|
headers::HeaderName,
|
||||||
|
http::{HeaderValue, Request, StatusCode},
|
||||||
response::{IntoResponse, Response},
|
response::{IntoResponse, Response},
|
||||||
routing::get,
|
routing::get,
|
||||||
Router,
|
BoxError, Router,
|
||||||
|
};
|
||||||
|
use tower::{ServiceBuilder, ServiceExt};
|
||||||
|
use tower_governor::{
|
||||||
|
errors::display_error, governor::GovernorConfigBuilder, key_extractor::SmartIpKeyExtractor,
|
||||||
|
GovernorLayer,
|
||||||
};
|
};
|
||||||
use tower::ServiceExt;
|
|
||||||
use tower_http::services::ServeFile;
|
use tower_http::services::ServeFile;
|
||||||
|
|
||||||
use crate::types::http::ResponseCode;
|
use crate::types::http::ResponseCode;
|
||||||
|
@ -16,6 +22,15 @@ pub mod file;
|
||||||
pub mod pages;
|
pub mod pages;
|
||||||
|
|
||||||
pub fn router() -> Router {
|
pub fn router() -> Router {
|
||||||
|
let governor_conf = Box::new(
|
||||||
|
GovernorConfigBuilder::default()
|
||||||
|
.burst_size(20)
|
||||||
|
.per_second(1)
|
||||||
|
.key_extractor(SmartIpKeyExtractor)
|
||||||
|
.finish()
|
||||||
|
.expect("Failed to create rate limiter"),
|
||||||
|
);
|
||||||
|
|
||||||
Router::new()
|
Router::new()
|
||||||
.nest("/", pages::router())
|
.nest("/", pages::router())
|
||||||
.route("/js/*path", get(file::js))
|
.route("/js/*path", get(file::js))
|
||||||
|
@ -24,6 +39,15 @@ pub fn router() -> Router {
|
||||||
.route("/image/*path", get(file::image))
|
.route("/image/*path", get(file::image))
|
||||||
.route("/image/avatar", get(file::avatar))
|
.route("/image/avatar", get(file::avatar))
|
||||||
.route("/image/banner", get(file::banner))
|
.route("/image/banner", get(file::banner))
|
||||||
|
.layer(
|
||||||
|
ServiceBuilder::new()
|
||||||
|
.layer(HandleErrorLayer::new(|e: BoxError| async move {
|
||||||
|
display_error(e)
|
||||||
|
}))
|
||||||
|
.layer(GovernorLayer {
|
||||||
|
config: Box::leak(governor_conf),
|
||||||
|
}),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn serve(path: &str) -> Response {
|
pub async fn serve(path: &str) -> Response {
|
||||||
|
@ -34,7 +58,7 @@ pub async fn serve(path: &str) -> Response {
|
||||||
let path = format!("public{path}");
|
let path = format!("public{path}");
|
||||||
let file = ServeFile::new(path);
|
let file = ServeFile::new(path);
|
||||||
|
|
||||||
let Ok(res) = file.oneshot(Request::new(Body::empty())).await else {
|
let Ok(mut res) = file.oneshot(Request::new(Body::empty())).await else {
|
||||||
tracing::error!("Error while fetching file");
|
tracing::error!("Error while fetching file");
|
||||||
return ResponseCode::InternalServerError.text("Error while fetching file");
|
return ResponseCode::InternalServerError.text("Error while fetching file");
|
||||||
};
|
};
|
||||||
|
@ -43,5 +67,10 @@ pub async fn serve(path: &str) -> Response {
|
||||||
return ResponseCode::NotFound.text("File not found");
|
return ResponseCode::NotFound.text("File not found");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
res.headers_mut().insert(
|
||||||
|
HeaderName::from_static("cache-control"),
|
||||||
|
HeaderValue::from_static("public max-age=300"),
|
||||||
|
);
|
||||||
|
|
||||||
res.into_response()
|
res.into_response()
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue