From fe02be7e34d4925d0b9ab0a39d0534cdbe202d8a Mon Sep 17 00:00:00 2001 From: Glenn Strauss Date: Sat, 9 Jul 2016 11:01:13 -0400 Subject: [PATCH] [core] make server.max-request-size scopeable (fixes #1901) x-ref: "make server.max-request-size scopeable" https://redmine.lighttpd.net/issues/1901 --- src/base.h | 1 - src/configfile.c | 6 +++++- src/request.c | 16 ---------------- src/response.c | 12 ++++++++++++ 4 files changed, 17 insertions(+), 18 deletions(-) diff --git a/src/base.h b/src/base.h index 6798a662..77bc44ed 100644 --- a/src/base.h +++ b/src/base.h @@ -543,7 +543,6 @@ typedef struct { unsigned short max_worker; unsigned short max_fds; unsigned short max_conns; - unsigned int max_request_size; unsigned short log_request_header_on_error; unsigned short log_state_handling; diff --git a/src/configfile.c b/src/configfile.c index 6489b09c..476c0e93 100644 --- a/src/configfile.c +++ b/src/configfile.c @@ -165,7 +165,6 @@ static int config_insert(server *srv) { cv[10].destination = srv->srvconf.event_handler; cv[11].destination = srv->srvconf.pid_file; - cv[12].destination = &(srv->srvconf.max_request_size); cv[13].destination = &(srv->srvconf.max_worker); cv[23].destination = &(srv->srvconf.max_fds); @@ -222,6 +221,7 @@ static int config_insert(server *srv) { s->max_keep_alive_idle = 5; s->max_read_idle = 60; s->max_write_idle = 360; + s->max_request_size = 0; s->use_xattr = 0; s->ssl_enabled = 0; s->ssl_honor_cipher_order = 1; @@ -259,6 +259,7 @@ static int config_insert(server *srv) { cv[7].destination = s->server_tag; cv[8].destination = &(s->use_ipv6); + cv[12].destination = &(s->max_request_size); cv[14].destination = s->document_root; cv[15].destination = &(s->force_lowercase_filenames); cv[16].destination = &(s->log_condition_handling); @@ -441,6 +442,7 @@ int config_setup_connection(server *srv, connection *con) { PATCH(max_keep_alive_idle); PATCH(max_read_idle); PATCH(max_write_idle); + PATCH(max_request_size); PATCH(use_xattr); PATCH(error_handler); PATCH(error_handler_404); @@ -537,6 +539,8 @@ int config_patch_connection(server *srv, connection *con) { PATCH(max_write_idle); } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("server.max-read-idle"))) { PATCH(max_read_idle); + } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("server.max-request-size"))) { + PATCH(max_request_size); } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("mimetype.use-xattr"))) { PATCH(use_xattr); } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("etag.use-inode"))) { diff --git a/src/request.c b/src/request.c index 72be9c44..8c09fe38 100644 --- a/src/request.c +++ b/src/request.c @@ -1277,22 +1277,6 @@ int http_request_parse(server *srv, connection *con) { return 0; } - /* srvconf.max_request_size is in kBytes */ - if (srv->srvconf.max_request_size != 0 && - (off_t)con->request.content_length > ((off_t)srv->srvconf.max_request_size << 10)) { - /* the request body itself is larger then - * our our max_request_size - */ - - con->http_status = 413; - con->keep_alive = 0; - - log_error_write(srv, __FILE__, __LINE__, "sos", - "request-size too long:", (off_t) con->request.content_length, "-> 413"); - return 0; - } - - /* we have content */ if (con->request.content_length != 0) { return 1; diff --git a/src/response.c b/src/response.c index 7418f2b4..8953d487 100644 --- a/src/response.c +++ b/src/response.c @@ -341,6 +341,18 @@ handler_t http_response_prepare(server *srv, connection *con) { log_error_write(srv, __FILE__, __LINE__, "sb", "URI-query : ", con->uri.query); } + /* con->conf.max_request_size is in kBytes */ + if (0 != con->conf.max_request_size && + (off_t)con->request.content_length > ((off_t)con->conf.max_request_size << 10)) { + log_error_write(srv, __FILE__, __LINE__, "sos", + "request-size too long:", (off_t) con->request.content_length, "-> 413"); + con->keep_alive = 0; + con->http_status = 413; + con->file_finished = 1; + + return HANDLER_FINISHED; + } + /** * -- 2.11.4.GIT