diff options
author | gennyble <gen@nyble.dev> | 2025-03-18 07:57:41 -0500 |
---|---|---|
committer | gennyble <gen@nyble.dev> | 2025-03-18 07:57:41 -0500 |
commit | bd2bd57890894c6dfb44501cf6a62b6e4e292e06 (patch) | |
tree | a639c5bbd6bc36515a89c125acf722a987556f18 | |
parent | aad1583d8b5ae737bb424c461925bc69119c36e9 (diff) | |
download | corgi-bd2bd57890894c6dfb44501cf6a62b6e4e292e06.tar.gz corgi-bd2bd57890894c6dfb44501cf6a62b6e4e292e06.zip |
Set all headers for cgi env
-rw-r--r-- | corgi/src/caller.rs | 49 |
1 files changed, 31 insertions, 18 deletions
diff --git a/corgi/src/caller.rs b/corgi/src/caller.rs index 1803ccf..1e1d138 100644 --- a/corgi/src/caller.rs +++ b/corgi/src/caller.rs @@ -24,6 +24,30 @@ impl HttpRequest { pub const GATEWAY_INTERFACE: &str = "CGI/1.1"; const SERVER_SOFTWARE: &'static str = concat!(env!("CARGO_PKG_NAME"), '/', env!("CARGO_PKG_VERSION")); + + pub fn build_kv(&self) -> Vec<(String, String)> { + let mut kv = vec![]; + + macro_rules! add { + ($key:ident, $value:expr) => { + kv.push((String::from(stringify!($key)), $value.to_string())) + }; + } + + add!(CONTENT_TYPE, self.content_type); + add!(GATEWAY_INTERFACE, Self::GATEWAY_INTERFACE); + add!(PATH_INFO, self.path_info); + add!(QUERY_STRING, self.query_string); + add!(REMOTE_ADDR, self.remote_addr.to_string()); + add!(REQUEST_METHOD, self.request_method); + add!(SCRIPT_NAME, self.script_name); + add!(SERVER_NAME, self.server_name); + add!(SERVER_PORT, self.server_port); + add!(SERVER_PROTOCOL, self.server_protocol); + add!(SERVER_SOFTWARE, Self::SERVER_SOFTWARE); + + kv + } } pub async fn call_and_parse_cgi(script: Script, http: HttpRequest) -> CgiResponse { @@ -34,27 +58,16 @@ pub async fn call_and_parse_cgi(script: Script, http: HttpRequest) -> CgiRespons } let mut cmd = Command::new(&script.filename); - cmd.env("CONTENT_TYPE", http.content_type) - .env("GATEWAY_INTERFACE", HttpRequest::GATEWAY_INTERFACE) - .env("PATH_INFO", http.path_info) - .env("QUERY_STRING", http.query_string) - .env("REMOTE_ADDR", http.remote_addr.to_string()) - .env("REQUEST_METHOD", http.request_method) - .env("SCRIPT_NAME", http.script_name) - .env("SERVER_NAME", http.server_name) - .env("SERVER_PORT", http.server_port.to_string()) - .env("SERVER_PROTOCOL", http.server_protocol) - .env("SERVER_SOFTWARE", HttpRequest::SERVER_SOFTWARE); - - http.http_headers.into_iter().for_each(|(key, val)| { - cmd.env(key, val); - }); // Set env specified in the conf. Be sure we do this after we // set the HTTP headers as to overwrite any we might want - script.env.iter().for_each(|(key, val)| { - cmd.env(key.to_ascii_uppercase(), val); - }); + http.build_kv() + .into_iter() + .chain(http.http_headers.into_iter()) + .chain(script.env.into_iter()) + .for_each(|(key, val)| { + cmd.env(key, val); + }); let cmd = cmd.stdout(Stdio::piped()).stderr(Stdio::piped()); let output = if let Some(bytes) = http.body { |