diff --git a/src/main.rs b/src/main.rs index 67016c6..93d101a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,11 @@ use anyhow::{Context, Result}; +use axum::extract::State; +use axum::http::{Response, StatusCode}; +use axum::response::IntoResponse; use std::env; use std::future::IntoFuture; use std::net::{SocketAddr, ToSocketAddrs}; +use std::path::PathBuf; use std::time::Duration; use tokio::io::{AsyncRead, AsyncReadExt, AsyncWrite, AsyncWriteExt}; use tokio::net::TcpStream; @@ -83,13 +87,14 @@ impl ServerCertVerifier for NoCertificateVerification { } } +#[derive(Clone)] struct Config { proxy_listen_address: String, http_listen_address: String, cert_path: String, key_path: String, mumble_server_address: SocketAddr, - gui_path: String, + gui_path: PathBuf, } impl Config { @@ -106,13 +111,32 @@ impl Config { .to_socket_addrs()? .next() .ok_or(anyhow::anyhow!("Invalid mumble server address"))?, - gui_path: env::var("MUMBLE_WEBTRANSPORT_GUI_PATH").unwrap_or("gui".to_string()), + gui_path: PathBuf::from( + env::var("MUMBLE_WEBTRANSPORT_GUI_PATH").unwrap_or("gui".to_string()), + ), }) } } -async fn redirect() -> axum::response::Redirect { - axum::response::Redirect::to("/static/index.html") +//async fn serve_index_html_with_config(State(config): State) -> impl IntoResponse { +async fn serve_index_html_with_config(State(config): State) -> impl IntoResponse { + // Load the HTML file + let html = match tokio::fs::read_to_string(config.gui_path.join("index.html")).await { + Ok(content) => content, + Err(_) => return (StatusCode::NOT_FOUND, "File not found").into_response(), + }; + + // Insert the script tag with configuration + let config_script = ""; + let modified_html = html.replace("", &format!("{}\n", config_script)); + + // Create a response with the modified HTML + Response::builder() + .status(StatusCode::OK) + .header("Content-Type", "text/html") + .body(modified_html) + .unwrap() + .into_response() } #[tokio::main] @@ -124,11 +148,9 @@ async fn main() -> Result<()> { // Setup HTTP Server //let http = axum::Router::new().route("/", axum::routing::get(serve_gui)); let app = axum::Router::new() - .nest_service( - "/gui", - tower_http::services::ServeDir::new(proxy_config.gui_path), - ) - .route("/", axum::routing::get(redirect)); + .route("/", axum::routing::get(serve_index_html_with_config)) + .fallback_service(tower_http::services::ServeDir::new(&proxy_config.gui_path)) + .with_state(proxy_config.clone()); let listener = tokio::net::TcpListener::bind(proxy_config.http_listen_address) .await .unwrap();