about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--corgi/src/caller.rs49
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 {