diff --git a/src/server/cgi.rs b/src/server/cgi.rs index 3ef9eff..1b7f970 100644 --- a/src/server/cgi.rs +++ b/src/server/cgi.rs @@ -42,11 +42,18 @@ impl Handler { } }; + if let Err(why) = std::fs::metadata(&path) { + log::error!("can't find {:?}: {}", path, why); + return Ok(Response::not_found()); + } + let filtered_env: HashMap = std::env::vars() .filter(|&(ref k, _)| k == "TERM" || k == "TZ" || k == "LANG" || k == "PATH") .collect(); - let output = Command::new(path.clone()) + let remote_host = format!("{}", r.addr); + + let output = Command::new(&path) .env_clear() .envs(filtered_env) .env("GATEWAY_INTERFACE", "CGI/1.1") @@ -59,8 +66,8 @@ impl Handler { .env("SERVER_NAME", r.url.host_str().unwrap()) .env("SERVER_HOSTNAME", r.url.host_str().unwrap()) .env("SERVER_PORT", format!("{}", r.url.port().unwrap_or(1965))) - .env("REMOTE_HOST", "127.0.0.1") - .env("REMOTE_ADDR", "127.0.0.1") + .env("REMOTE_HOST", &remote_host) + .env("REMOTE_ADDR", remote_host) .env("TLS_CIPHER", "Secure") .env("TLS_VERSION", "TLSv1.3") .output()?; diff --git a/src/server/mod.rs b/src/server/mod.rs index 9cb3b56..5562919 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -15,6 +15,7 @@ use url::Url; #[allow(dead_code)] pub struct Request { pub url: Url, + pub addr: SocketAddr, pub certs: Option>, } @@ -103,6 +104,7 @@ async fn handle_request( let req = Request { url: url, + addr: addr, certs: None, }; handle(h, req, &mut stream, addr).await; @@ -155,7 +157,7 @@ async fn parse_request(mut stream: R) -> Result { Url::parse(request)? }; - // Validate the URL. TODO: Check the hostname and port. + // Validate the URL. Ok(url) }