kjuulh
11323c0752
All checks were successful
continuous-integration/drone/push Build is passing
Signed-off-by: kjuulh <contact@kjuulh.io>
64 lines
2.2 KiB
Rust
64 lines
2.2 KiB
Rust
use cfg_if::cfg_if;
|
|
|
|
cfg_if! {
|
|
if #[cfg(feature = "ssr")] {
|
|
use axum::{
|
|
body::{boxed, Body, BoxBody},
|
|
http::{Request, Response, StatusCode, Uri},
|
|
};
|
|
use tower::ServiceExt;
|
|
use tower_http::services::ServeDir;
|
|
|
|
pub async fn file_handler(uri: Uri) -> Result<Response<BoxBody>, (StatusCode, String)> {
|
|
let res = get_static_file(uri.clone(), "/pkg").await?;
|
|
|
|
if res.status() == StatusCode::NOT_FOUND {
|
|
// try with `.html`
|
|
// TODO: handle if the Uri has query parameters
|
|
match format!("{}.html", uri).parse() {
|
|
Ok(uri_html) => get_static_file(uri_html, "/pkg").await,
|
|
Err(_) => Err((StatusCode::INTERNAL_SERVER_ERROR, "Invalid URI".to_string())),
|
|
}
|
|
} else {
|
|
Ok(res)
|
|
}
|
|
}
|
|
|
|
pub async fn get_static_file_handler(uri: Uri) -> Result<Response<BoxBody>, (StatusCode, String)> {
|
|
let res = get_static_file(uri.clone(), "/static").await?;
|
|
|
|
if res.status() == StatusCode::NOT_FOUND {
|
|
Err((StatusCode::INTERNAL_SERVER_ERROR, "Invalid URI".to_string()))
|
|
} else {
|
|
Ok(res)
|
|
}
|
|
}
|
|
|
|
async fn get_static_file(uri: Uri, base: &str) -> Result<Response<BoxBody>, (StatusCode, String)> {
|
|
let req = Request::builder().uri(&uri).body(Body::empty()).unwrap();
|
|
|
|
// `ServeDir` implements `tower::Service` so we can call it with `tower::ServiceExt::oneshot`
|
|
// When run normally, the root should be the crate root
|
|
if base == "/static" {
|
|
match ServeDir::new("./static").oneshot(req).await {
|
|
Ok(res) => Ok(res.map(boxed)),
|
|
Err(err) => Err((
|
|
StatusCode::INTERNAL_SERVER_ERROR,
|
|
format!("Something went wrong: {}", err),
|
|
))
|
|
}
|
|
} else if base == "/pkg" {
|
|
match ServeDir::new("./pkg").oneshot(req).await {
|
|
Ok(res) => Ok(res.map(boxed)),
|
|
Err(err) => Err((
|
|
StatusCode::INTERNAL_SERVER_ERROR,
|
|
format!("Something went wrong: {}", err),
|
|
)),
|
|
}
|
|
} else{
|
|
Err((StatusCode::NOT_FOUND, "Not Found".to_string()))
|
|
}
|
|
}
|
|
}
|
|
}
|