commit 2822488312805fd2b02a43fc71ad7c81f39c2a98
parent 159cdb3e0b6c239a319f951291ed9e3886d38cc6
Author: Hiltjo Posthuma <hiltjo@codemadness.org>
Date: Thu, 14 Aug 2014 17:10:38 +0000
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).
Diffstat:
M | quark.c | | | 23 | +++++++++++++++++++++-- |
1 file changed, 21 insertions(+), 2 deletions(-)
diff --git 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();