From 5d148e2646874a6f460402f2dd70ea2fb6be08dd Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Tue, 21 Nov 2006 00:12:09 +0000 Subject: httpd: fix cgi-bin/index.cgi support, add example of it, stat: fix end-of-line if format is specified (wasn't printing it), fix %z (time) format to match coreutils 6.3 --- networking/httpd.c | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) (limited to 'networking/httpd.c') diff --git a/networking/httpd.c b/networking/httpd.c index 47d41a1e2..08b40e014 100644 --- a/networking/httpd.c +++ b/networking/httpd.c @@ -1103,7 +1103,7 @@ static int sendCgi(const char *url, post_readed_size = 0; post_readed_idx = 0; - inFd = fromCgi[0]; + inFd = fromCgi[0]; outFd = toCgi[1]; close(fromCgi[1]); close(toCgi[0]); @@ -1190,6 +1190,10 @@ static int sendCgi(const char *url, if (strncmp(rbuf, "HTTP/1.0 200 OK\r\n", 4) != 0) { full_write(s, "HTTP/1.0 200 OK\r\n", 17); } + /* Sometimes CGI is writing to pipe in small chunks + * and we don't see Content-type (because the read + * is too short) and we emit bogus "text/plain"! + * Is it a bug or CGI *has to* write it in one piece? */ if (strstr(rbuf, "ontent-") == 0) { full_write(s, "Content-type: text/plain\r\n\r\n", 28); } @@ -1480,6 +1484,7 @@ static void handleIncoming(void) strcpy(url, buf); /* extract url args if present */ test = strchr(url, '?'); + config->query = NULL; if (test) { *test++ = '\0'; config->query = test; @@ -1640,20 +1645,26 @@ static void handleIncoming(void) sendHeaders(HTTP_NOT_IMPLEMENTED); break; } - if (purl[-1] == '/') { - if (access("cgi-bin/index.cgi", X_OK) == 0) { - config->query = url; - sendCgi("/cgi-bin/index.cgi", prequest, length, cookie, content_type); - break; - } - } #endif /* FEATURE_HTTPD_CGI */ if (purl[-1] == '/') strcpy(purl, "index.html"); if (stat(test, &sb) == 0) { + /* It's a dir URL and there is index.html */ config->ContentLength = sb.st_size; config->last_mod = sb.st_mtime; } +#if ENABLE_FEATURE_HTTPD_CGI + else if (purl[-1] == '/') { + /* It's a dir URL and there is no index.html + * Try cgi-bin/index.cgi */ + if (access("/cgi-bin/index.cgi"+1, X_OK) == 0) { + purl[0] = '\0'; + config->query = url; + sendCgi("/cgi-bin/index.cgi", prequest, length, cookie, content_type); + break; + } + } +#endif /* FEATURE_HTTPD_CGI */ sendFile(test); config->ContentLength = -1; } while (0); -- cgit v1.2.3