httpd: add support for directory indexer (cgi-bin/index.cgi)

This commit is contained in:
Denis Vlasenko 2006-11-21 00:08:39 +00:00
parent a3ee69fa6c
commit 6c85ddc850

View File

@ -893,9 +893,8 @@ static int sendHeaders(HttpResponseNum responseNum)
responseNum, responseString, responseNum, responseString,
responseNum, responseString, infoString); responseNum, responseString, infoString);
} }
#if DEBUG if (DEBUG)
fprintf(stderr, "headers: '%s'\n", buf); fprintf(stderr, "headers: '%s'\n", buf);
#endif
return full_write(config->accepted_socket, buf, len); return full_write(config->accepted_socket, buf, len);
} }
@ -1028,7 +1027,7 @@ static int sendCgi(const char *url,
setenv1("REQUEST_URI", purl); setenv1("REQUEST_URI", purl);
} }
if (script != NULL) if (script != NULL)
*script = '\0'; /* reduce /PATH_INFO */ *script = '\0'; /* cut off /PATH_INFO */
/* SCRIPT_FILENAME required by PHP in CGI mode */ /* SCRIPT_FILENAME required by PHP in CGI mode */
if (!realpath(purl + 1, realpath_buff)) if (!realpath(purl + 1, realpath_buff))
goto error_execing_cgi; goto error_execing_cgi;
@ -1546,7 +1545,7 @@ static void handleIncoming(void)
*test = '/'; *test = '/';
} }
if (blank >= 0) { if (blank >= 0) {
// read until blank line for HTTP version specified, else parse immediate /* read until blank line for HTTP version specified, else parse immediate */
while (1) { while (1) {
alarm(TIMEOUT); alarm(TIMEOUT);
count = getLine(); count = getLine();
@ -1568,7 +1567,7 @@ static void handleIncoming(void)
length = strtol(test, &test, 10); length = strtol(test, &test, 10);
/* length is "ulong", but we need to pass it to int later */ /* length is "ulong", but we need to pass it to int later */
/* so we check for negative or too large values in one go: */ /* so we check for negative or too large values in one go: */
/* (long -> ulong conv will cause negatives to be seen as > INT_MAX) */ /* (long -> ulong conv caused negatives to be seen as > INT_MAX) */
if (test[0] || errno || length > INT_MAX) if (test[0] || errno || length > INT_MAX)
goto bail_out; goto bail_out;
} }
@ -1599,7 +1598,7 @@ static void handleIncoming(void)
} /* while extra header reading */ } /* while extra header reading */
} }
(void) alarm(0); alarm(0);
if (config->alarm_signaled) if (config->alarm_signaled)
break; break;
@ -1631,12 +1630,21 @@ FORBIDDEN: /* protect listing /cgi-bin */
#if ENABLE_FEATURE_HTTPD_CGI #if ENABLE_FEATURE_HTTPD_CGI
if (strncmp(test, "cgi-bin", 7) == 0) { if (strncmp(test, "cgi-bin", 7) == 0) {
if (test[7] == '/' && test[8] == 0) if (test[7] == '/' && test[8] == 0)
goto FORBIDDEN; // protect listing cgi-bin/ goto FORBIDDEN; /* protect listing cgi-bin/ */
sendCgi(url, prequest, length, cookie, content_type); sendCgi(url, prequest, length, cookie, content_type);
} else { break;
if (prequest != request_GET) }
if (prequest != request_GET) {
sendHeaders(HTTP_NOT_IMPLEMENTED); sendHeaders(HTTP_NOT_IMPLEMENTED);
else { 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 */ #endif /* FEATURE_HTTPD_CGI */
if (purl[-1] == '/') if (purl[-1] == '/')
strcpy(purl, "index.html"); strcpy(purl, "index.html");
@ -1646,10 +1654,6 @@ FORBIDDEN: /* protect listing /cgi-bin */
} }
sendFile(test); sendFile(test);
config->ContentLength = -1; config->ContentLength = -1;
#if ENABLE_FEATURE_HTTPD_CGI
}
}
#endif
} while (0); } while (0);
bail_out: bail_out: