summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Kneschke <jan@kneschke.de>2006-02-02 11:51:10 +0000
committerJan Kneschke <jan@kneschke.de>2006-02-02 11:51:10 +0000
commitd666aea66609dfec075686d7a2c108e371ce93e6 (patch)
treed4052ffab347a23847660422bcd60408b6dba412
parent29e95ddabbdf5d3e57564d1f78cd4e73fa34ba6d (diff)
downloadlighttpd-git-d666aea66609dfec075686d7a2c108e371ce93e6.tar.gz
only load reasons for broken HTTP headers on request
git-svn-id: svn+ssh://svn.lighttpd.net/lighttpd/branches/lighttpd-merge-1.4.x@980 152afb58-edef-0310-8abb-c4023f1b3aa9
-rw-r--r--src/request.c111
1 files changed, 68 insertions, 43 deletions
diff --git a/src/request.c b/src/request.c
index d403ce8c..020333ee 100644
--- a/src/request.c
+++ b/src/request.c
@@ -337,8 +337,8 @@ int http_request_parse(server *srv, connection *con) {
con->response.keep_alive = 0;
con->keep_alive = 0;
- log_error_write(srv, __FILE__, __LINE__, "s", "incomplete request line -> 400");
if (srv->srvconf.log_request_header_on_error) {
+ log_error_write(srv, __FILE__, __LINE__, "s", "incomplete request line -> 400");
log_error_write(srv, __FILE__, __LINE__, "Sb",
"request-header:\n",
con->request.request);
@@ -357,8 +357,8 @@ int http_request_parse(server *srv, connection *con) {
con->response.keep_alive = 0;
con->keep_alive = 0;
- log_error_write(srv, __FILE__, __LINE__, "s", "unknown http-method -> 501");
if (srv->srvconf.log_request_header_on_error) {
+ log_error_write(srv, __FILE__, __LINE__, "s", "unknown http-method -> 501");
log_error_write(srv, __FILE__, __LINE__, "Sb",
"request-header:\n",
con->request.request);
@@ -377,8 +377,8 @@ int http_request_parse(server *srv, connection *con) {
} else {
con->http_status = 505;
- log_error_write(srv, __FILE__, __LINE__, "s", "unknown HTTP version -> 505");
if (srv->srvconf.log_request_header_on_error) {
+ log_error_write(srv, __FILE__, __LINE__, "s", "unknown HTTP version -> 505");
log_error_write(srv, __FILE__, __LINE__, "Sb",
"request-header:\n",
con->request.request);
@@ -389,8 +389,8 @@ int http_request_parse(server *srv, connection *con) {
con->http_status = 400;
con->keep_alive = 0;
- log_error_write(srv, __FILE__, __LINE__, "s", "unknown protocol -> 400");
if (srv->srvconf.log_request_header_on_error) {
+ log_error_write(srv, __FILE__, __LINE__, "s", "unknown protocol -> 400");
log_error_write(srv, __FILE__, __LINE__, "Sb",
"request-header:\n",
con->request.request);
@@ -415,23 +415,23 @@ int http_request_parse(server *srv, connection *con) {
con->http_status = 400;
con->keep_alive = 0;
- buf[0] = con->request.uri->ptr[j];
- buf[1] = '\0';
+ if (srv->srvconf.log_request_header_on_error) {
+ buf[0] = con->request.uri->ptr[j];
+ buf[1] = '\0';
- if (con->request.uri->ptr[j] > 32 &&
- con->request.uri->ptr[j] != 127) {
- /* the character is printable -> print it */
- log_error_write(srv, __FILE__, __LINE__, "ss",
- "invalid character in URI -> 400",
- buf);
- } else {
- /* a control-character, print ascii-code */
- log_error_write(srv, __FILE__, __LINE__, "sd",
- "invalid character in URI -> 400",
- con->request.uri->ptr[j]);
- }
+ if (con->request.uri->ptr[j] > 32 &&
+ con->request.uri->ptr[j] != 127) {
+ /* the character is printable -> print it */
+ log_error_write(srv, __FILE__, __LINE__, "ss",
+ "invalid character in URI -> 400",
+ buf);
+ } else {
+ /* a control-character, print ascii-code */
+ log_error_write(srv, __FILE__, __LINE__, "sd",
+ "invalid character in URI -> 400",
+ con->request.uri->ptr[j]);
+ }
- if (srv->srvconf.log_request_header_on_error) {
log_error_write(srv, __FILE__, __LINE__, "Sb",
"request-header:\n",
con->request.request);
@@ -468,8 +468,8 @@ int http_request_parse(server *srv, connection *con) {
con->response.keep_alive = 0;
con->keep_alive = 0;
- log_error_write(srv, __FILE__, __LINE__, "s", "overlong request line -> 400");
if (srv->srvconf.log_request_header_on_error) {
+ log_error_write(srv, __FILE__, __LINE__, "s", "overlong request line -> 400");
log_error_write(srv, __FILE__, __LINE__, "Sb",
"request-header:\n",
con->request.request);
@@ -576,7 +576,12 @@ int http_request_parse(server *srv, connection *con) {
default:
/* error */
- log_error_write(srv, __FILE__, __LINE__, "s", "WS character in key -> 400");
+ if (srv->srvconf.log_request_header_on_error) {
+ log_error_write(srv, __FILE__, __LINE__, "s", "WS character in key -> 400");
+ log_error_write(srv, __FILE__, __LINE__, "Sb",
+ "request-header:\n",
+ con->request.request);
+ }
con->http_status = 400;
con->response.keep_alive = 0;
@@ -599,7 +604,12 @@ int http_request_parse(server *srv, connection *con) {
break;
} else {
- log_error_write(srv, __FILE__, __LINE__, "s", "CR without LF -> 400");
+ if (srv->srvconf.log_request_header_on_error) {
+ log_error_write(srv, __FILE__, __LINE__, "s", "CR without LF -> 400");
+ log_error_write(srv, __FILE__, __LINE__, "Sb",
+ "request-header:\n",
+ con->request.request);
+ }
con->http_status = 400;
con->keep_alive = 0;
@@ -642,8 +652,14 @@ int http_request_parse(server *srv, connection *con) {
con->keep_alive = 0;
con->response.keep_alive = 0;
- log_error_write(srv, __FILE__, __LINE__, "sbsds",
+ if (srv->srvconf.log_request_header_on_error) {
+ log_error_write(srv, __FILE__, __LINE__, "sbsds",
"CTL character in key", con->request.request, cur, *cur, "-> 400");
+
+ log_error_write(srv, __FILE__, __LINE__, "Sb",
+ "request-header:\n",
+ con->request.request);
+ }
return 0;
default:
@@ -662,7 +678,14 @@ int http_request_parse(server *srv, connection *con) {
if (!ds) {
/* 400 */
- log_error_write(srv, __FILE__, __LINE__, "s", "WS at the start of first line -> 400");
+ if (srv->srvconf.log_request_header_on_error) {
+ log_error_write(srv, __FILE__, __LINE__, "s", "WS at the start of first line -> 400");
+
+ log_error_write(srv, __FILE__, __LINE__, "Sb",
+ "request-header:\n",
+ con->request.request);
+ }
+
con->http_status = 400;
con->keep_alive = 0;
@@ -725,9 +748,9 @@ int http_request_parse(server *srv, connection *con) {
con->http_status = 400;
con->keep_alive = 0;
- log_error_write(srv, __FILE__, __LINE__, "s",
- "duplicate Content-Length-header -> 400");
if (srv->srvconf.log_request_header_on_error) {
+ log_error_write(srv, __FILE__, __LINE__, "s",
+ "duplicate Content-Length-header -> 400");
log_error_write(srv, __FILE__, __LINE__, "Sb",
"request-header:\n",
con->request.request);
@@ -774,9 +797,9 @@ int http_request_parse(server *srv, connection *con) {
con->http_status = 400;
con->keep_alive = 0;
- log_error_write(srv, __FILE__, __LINE__, "s",
- "duplicate Content-Type-header -> 400");
if (srv->srvconf.log_request_header_on_error) {
+ log_error_write(srv, __FILE__, __LINE__, "s",
+ "duplicate Content-Type-header -> 400");
log_error_write(srv, __FILE__, __LINE__, "Sb",
"request-header:\n",
con->request.request);
@@ -811,9 +834,9 @@ int http_request_parse(server *srv, connection *con) {
con->http_status = 400;
con->keep_alive = 0;
- log_error_write(srv, __FILE__, __LINE__, "s",
- "duplicate Host-header -> 400");
if (srv->srvconf.log_request_header_on_error) {
+ log_error_write(srv, __FILE__, __LINE__, "s",
+ "duplicate Host-header -> 400");
log_error_write(srv, __FILE__, __LINE__, "Sb",
"request-header:\n",
con->request.request);
@@ -833,9 +856,9 @@ int http_request_parse(server *srv, connection *con) {
con->http_status = 400;
con->keep_alive = 0;
- log_error_write(srv, __FILE__, __LINE__, "s",
- "duplicate If-Modified-Since header -> 400");
if (srv->srvconf.log_request_header_on_error) {
+ log_error_write(srv, __FILE__, __LINE__, "s",
+ "duplicate If-Modified-Since header -> 400");
log_error_write(srv, __FILE__, __LINE__, "Sb",
"request-header:\n",
con->request.request);
@@ -850,9 +873,9 @@ int http_request_parse(server *srv, connection *con) {
con->http_status = 400;
con->keep_alive = 0;
- log_error_write(srv, __FILE__, __LINE__, "s",
- "duplicate If-None-Match-header -> 400");
if (srv->srvconf.log_request_header_on_error) {
+ log_error_write(srv, __FILE__, __LINE__, "s",
+ "duplicate If-None-Match-header -> 400");
log_error_write(srv, __FILE__, __LINE__, "Sb",
"request-header:\n",
con->request.request);
@@ -873,9 +896,9 @@ int http_request_parse(server *srv, connection *con) {
con->http_status = 400;
con->keep_alive = 0;
- log_error_write(srv, __FILE__, __LINE__, "s",
- "duplicate Host-header -> 400");
if (srv->srvconf.log_request_header_on_error) {
+ log_error_write(srv, __FILE__, __LINE__, "s",
+ "duplicate Range-header -> 400");
log_error_write(srv, __FILE__, __LINE__, "Sb",
"request-header:\n",
con->request.request);
@@ -897,8 +920,10 @@ int http_request_parse(server *srv, connection *con) {
key_len = 0;
in_folding = 0;
} else {
- log_error_write(srv, __FILE__, __LINE__, "sbs",
- "CR without LF", con->request.request, "-> 400");
+ if (srv->srvconf.log_request_header_on_error) {
+ log_error_write(srv, __FILE__, __LINE__, "sbs",
+ "CR without LF", con->request.request, "-> 400");
+ }
con->http_status = 400;
con->keep_alive = 0;
@@ -937,8 +962,8 @@ int http_request_parse(server *srv, connection *con) {
con->response.keep_alive = 0;
con->keep_alive = 0;
- log_error_write(srv, __FILE__, __LINE__, "s", "HTTP/1.1 but Host missing -> 400");
if (srv->srvconf.log_request_header_on_error) {
+ log_error_write(srv, __FILE__, __LINE__, "s", "HTTP/1.1 but Host missing -> 400");
log_error_write(srv, __FILE__, __LINE__, "Sb",
"request-header:\n",
con->request.request);
@@ -959,10 +984,10 @@ int http_request_parse(server *srv, connection *con) {
/* check hostname field if it is set */
if (NULL != con->request.http_host &&
0 != request_check_hostname(srv, con, con->request.http_host)) {
- log_error_write(srv, __FILE__, __LINE__, "s",
- "Invalid Hostname -> 400");
if (srv->srvconf.log_request_header_on_error) {
+ log_error_write(srv, __FILE__, __LINE__, "s",
+ "Invalid Hostname -> 400");
log_error_write(srv, __FILE__, __LINE__, "Sb",
"request-header:\n",
con->request.request);
@@ -984,8 +1009,8 @@ int http_request_parse(server *srv, connection *con) {
/* content-length is missing */
log_error_write(srv, __FILE__, __LINE__, "s",
"GET/HEAD/OPTIONS with content-length -> 400");
+
con->keep_alive = 0;
-
con->http_status = 400;
return 0;
}
@@ -996,8 +1021,8 @@ int http_request_parse(server *srv, connection *con) {
/* content-length is missing */
log_error_write(srv, __FILE__, __LINE__, "s",
"POST-request, but content-length missing -> 411");
+
con->keep_alive = 0;
-
con->http_status = 411;
return 0;