quark

quark web server
git clone git://git.suckless.org/quark
Log | Files | Refs | LICENSE

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:
Mquark.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();