52 lines
1.4 KiB
Rust
52 lines
1.4 KiB
Rust
use axum::{
|
|
http::{header, StatusCode, Uri},
|
|
response::IntoResponse,
|
|
BoxError,
|
|
};
|
|
use rust_embed::RustEmbed;
|
|
|
|
pub mod auth;
|
|
pub mod setup;
|
|
|
|
#[derive(RustEmbed)]
|
|
#[folder = "../frontend/dist"]
|
|
pub struct Asset;
|
|
|
|
pub async fn static_handler(uri: Uri) -> impl IntoResponse {
|
|
let mut path = uri.path().trim_start_matches('/').to_string();
|
|
|
|
if path.is_empty() {
|
|
path = "index.html".to_string();
|
|
}
|
|
|
|
match Asset::get(&path) {
|
|
Some(content) => {
|
|
let mime = mime_guess::from_path(&path).first_or_octet_stream();
|
|
([(header::CONTENT_TYPE, mime.as_ref())], content.data).into_response()
|
|
}
|
|
None => {
|
|
if path.contains('.') {
|
|
return StatusCode::NOT_FOUND.into_response();
|
|
}
|
|
match Asset::get("index.html") {
|
|
Some(content) => {
|
|
let mime = mime_guess::from_path("index.html").first_or_octet_stream();
|
|
([(header::CONTENT_TYPE, mime.as_ref())], content.data).into_response()
|
|
}
|
|
None => StatusCode::NOT_FOUND.into_response(),
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
pub async fn handle_timeout_error(err: BoxError) -> (StatusCode, &'static str) {
|
|
if err.is::<tower::timeout::error::Elapsed>() {
|
|
(StatusCode::REQUEST_TIMEOUT, "Request timed out")
|
|
} else {
|
|
(
|
|
StatusCode::INTERNAL_SERVER_ERROR,
|
|
"Unhandled internal error",
|
|
)
|
|
}
|
|
}
|