From fd16ed25baf0c1c66bd37ff084ddaa1ca0cb3696 Mon Sep 17 00:00:00 2001 From: Markus Valentin Date: Mon, 4 Dec 2023 12:37:07 +0100 Subject: [PATCH] lib-http: Expand http_server_settings.request_limits to separate settings This simplifies the following changes. --- src/lib-http/http-server-connection.c | 9 ++++++++- src/lib-http/http-server.c | 6 +++++- src/lib-http/http-server.h | 7 ++++++- src/lib-http/test-http-payload.c | 2 +- 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/lib-http/http-server-connection.c b/src/lib-http/http-server-connection.c index 09cd6b10fe..d97c06ff34 100644 --- a/src/lib-http/http-server-connection.c +++ b/src/lib-http/http-server-connection.c @@ -166,8 +166,15 @@ static void http_server_connection_ready(struct http_server_connection *conn) base_url.host.name = my_hostname; base_url.have_ssl = conn->ssl; + const struct http_request_limits limits = { + .max_target_length = set->request_max_target_length, + .max_payload_size = set->request_max_payload_size, + .header.max_size = set->request_hdr_max_size, + .header.max_field_size = set->request_hdr_max_field_size, + .header.max_fields = set->request_hdr_max_fields, + }; conn->http_parser = http_request_parser_init( - conn->conn.input, &base_url, &conn->server->set.request_limits, + conn->conn.input, &base_url, &limits, HTTP_REQUEST_PARSE_FLAG_STRICT); o_stream_set_finish_via_child(conn->conn.output, FALSE); o_stream_set_flush_callback(conn->conn.output, diff --git a/src/lib-http/http-server.c b/src/lib-http/http-server.c index 64b72d7b09..9edd32dc52 100644 --- a/src/lib-http/http-server.c +++ b/src/lib-http/http-server.c @@ -47,7 +47,11 @@ struct http_server *http_server_init(const struct http_server_settings *set) server->set.max_client_idle_time_msecs = set->max_client_idle_time_msecs; server->set.max_pipelined_requests = (set->max_pipelined_requests > 0 ? set->max_pipelined_requests : 1); - server->set.request_limits = set->request_limits; + server->set.request_max_target_length = set->request_max_target_length; + server->set.request_max_payload_size = set->request_max_payload_size; + server->set.request_hdr_max_size = set->request_hdr_max_size; + server->set.request_hdr_max_field_size = set->request_hdr_max_field_size; + server->set.request_hdr_max_fields = set->request_hdr_max_fields; server->set.socket_send_buffer_size = set->socket_send_buffer_size; server->set.socket_recv_buffer_size = set->socket_recv_buffer_size; server->set.debug = set->debug; diff --git a/src/lib-http/http-server.h b/src/lib-http/http-server.h index 9b4f710285..d4be2fa967 100644 --- a/src/lib-http/http-server.h +++ b/src/lib-http/http-server.h @@ -35,7 +35,12 @@ struct http_server_settings { unsigned int max_pipelined_requests; /* Request limits */ - struct http_request_limits request_limits; + uoff_t request_max_target_length; + uoff_t request_max_payload_size; + /* Request header limits */ + uoff_t request_hdr_max_size; + uoff_t request_hdr_max_field_size; + unsigned int request_hdr_max_fields; /* The kernel send/receive buffer sizes used for the connection sockets. Configuring this is mainly useful for the test suite. The kernel diff --git a/src/lib-http/test-http-payload.c b/src/lib-http/test-http-payload.c index 6101719cf7..4b61b1baa9 100644 --- a/src/lib-http/test-http-payload.c +++ b/src/lib-http/test-http-payload.c @@ -1763,7 +1763,7 @@ static void test_init_server_settings(struct http_server_settings *server_set_r) { i_zero(server_set_r); - server_set_r->request_limits.max_payload_size = UOFF_T_MAX; + server_set_r->request_max_payload_size = UOFF_T_MAX; server_set_r->debug = debug; if (small_socket_buffers) { -- 2.47.3