sneedstr/src/relay/routes.rs

44 lines
1.3 KiB
Rust
Raw Normal View History

2024-01-12 09:35:31 -06:00
use super::handler;
use crate::utils::filter::with_context;
use crate::utils::structs::Context;
use warp::{Filter, Rejection, Reply};
pub fn routes(context: Context) -> impl Filter<Extract = impl Reply, Error = Rejection> + Clone {
let cors = warp::cors().allow_any_origin();
static_files().or(index(context)).with(cors)
}
fn index(context: Context) -> impl Filter<Extract = impl Reply, Error = Rejection> + Clone {
let client_ip = warp::addr::remote();
let real_client_ip = warp::header::optional::<std::net::SocketAddr>("X-Real-IP")
.or(warp::header::optional::<std::net::SocketAddr>(
"X-Forwarded-For",
))
.unify()
.map(|ip: Option<std::net::SocketAddr>| {
// Get the IP from either header,
// and unify into the inner type.
ip
});
2024-01-12 09:35:31 -06:00
warp::path::end()
.and(warp::ws())
.and(with_context(context))
.and(client_ip)
.and(real_client_ip)
2024-01-12 09:35:31 -06:00
.and_then(handler::ws_handler)
}
fn static_files() -> impl Filter<Extract = impl Reply, Error = Rejection> + Clone {
let mut exe_dir = std::env::current_exe().unwrap();
exe_dir.pop();
2024-01-12 09:35:31 -06:00
let mut www = exe_dir.clone();
2024-01-12 09:35:31 -06:00
www.pop();
www.push(std::path::Path::new("www/static"));
warp::get().and(warp::fs::dir(www))
}