cargo_hax/engine_debug_webapp/
mod.rs

1use tiny_http::{Header, Response, Server};
2
3fn get_server() -> Server {
4    let mut port = std::env::var_os("HAX_DEBUGGER_PORT")
5        .and_then(|s| s.into_string().ok())
6        .and_then(|s| s.parse::<u32>().ok())
7        .unwrap_or(8000);
8    loop {
9        if let Ok(server) = Server::http(format!("0.0.0.0:{}", port)) {
10            eprintln!("Hax webapp is available on http://localhost:{:?}", port);
11            return server;
12        }
13        std::thread::sleep(std::time::Duration::from_millis(300));
14        eprintln!("Could not listen to port {:?}, trying another", port);
15        port += 1;
16    }
17}
18
19pub fn run(get_json: impl Fn() -> String) {
20    let server = get_server();
21    let ct_html = Header::from_bytes(&b"Content-Type"[..], &b"text/html"[..]).unwrap();
22    let ct_js = Header::from_bytes(&b"Content-Type"[..], &b"text/javascript"[..]).unwrap();
23    let ct_utf8 = Header::from_bytes(&b"charset"[..], &b"utf-8"[..]).unwrap();
24    for request in server.incoming_requests() {
25        let response = match request.url() {
26            "/" => Response::from_string(include_str!("static/index.html"))
27                .with_header(ct_html.clone())
28                .with_header(ct_utf8.clone()),
29            "/script.js" => Response::from_string(include_str!("static/script.js"))
30                .with_header(ct_js.clone())
31                .with_header(ct_utf8.clone()),
32            path if path.starts_with("/debug-hax-engine.json") => {
33                Response::from_string(get_json()).with_header(ct_utf8.clone())
34            }
35            _ => Response::from_string("Unknown route".to_string()).with_status_code(404),
36        };
37        let _ = request.respond(response);
38    }
39}