From 2822488312805fd2b02a43fc71ad7c81f39c2a98 Mon Sep 17 00:00:00 2001 From: Hiltjo Posthuma Date: Thu, 14 Aug 2014 17:10:38 +0000 Subject: [PATCH] improve CGI support - set some more environment variables (PATH_INFO for example is used by cgit). Also set REMOTE_ADDR, SERVER_PORT, SERVER_SOFTWARE. - when a file is requested in cgi mode serve it, if it doesn't exist, pass it to the CGI script (needed for cgit image/CSS). --- quark.c | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/quark.c b/quark.c index dc28d82..a09e572 100644 --- a/quark.c +++ b/quark.c @@ -307,6 +307,7 @@ void responsecgi(void) { FILE *cgi; size_t r; + char *q; if (req.type == GET) setenv("REQUEST_METHOD", "GET", 1); @@ -316,8 +317,21 @@ responsecgi(void) { return; if (*reqhost) setenv("SERVER_NAME", reqhost, 1); + if((q = strchr(reqbuf, '?'))) { + setenv("QUERY_STRING", q + 1, 1); + *q = '\0'; + setenv("PATH_INFO", reqbuf, 1); + *q = '?'; + } else { + setenv("QUERY_STRING", "", 1); + setenv("PATH_INFO", reqbuf, 1); + } + setenv("SERVER_PORT", serverport, 1); + setenv("SERVER_SOFTWARE", "quark-"VERSION, 1); setenv("SCRIPT_NAME", cgi_script, 1); + setenv("REMOTE_ADDR", host, 1); setenv("REQUEST_URI", reqbuf, 1); + logmsg("CGI SERVER_NAME=%s SCRIPT_NAME=%s REQUEST_URI=%s\n", reqhost, cgi_script, reqbuf); if (chdir(cgi_dir) == -1) @@ -350,6 +364,7 @@ void response(void) { char *p; struct stat st; + int r; for (p = reqbuf; *p; p++) { if (*p == '\\' || (*p == '/' && *(p + 1) == '.')) { @@ -364,10 +379,14 @@ response(void) { } } + r = stat(reqbuf, &st); if (cgi_mode) { - responsecgi(); + if(r != -1 && !S_ISDIR(st.st_mode)) + responsefile(); + else + responsecgi(); } else { - if (stat(reqbuf, &st) != -1 && S_ISDIR(st.st_mode)) + if (r != -1 && S_ISDIR(st.st_mode)) responsedir(); else responsefile();