From: Markus Valentin Date: Thu, 23 Nov 2023 13:20:52 +0000 (+0100) Subject: lib-http: Add http-server-settings.c X-Git-Tag: 2.4.1~1063 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=68bf49ef5f9f00c94c369ffcccac4a9470705b4f;p=thirdparty%2Fdovecot%2Fcore.git lib-http: Add http-server-settings.c --- diff --git a/src/lib-http/Makefile.am b/src/lib-http/Makefile.am index c4e9799b09..3a123d41b1 100644 --- a/src/lib-http/Makefile.am +++ b/src/lib-http/Makefile.am @@ -34,6 +34,7 @@ libhttp_la_SOURCES = \ http-server-request.c \ http-server-connection.c \ http-server-resource.c \ + http-server-settings.c \ http-server.c headers = \ @@ -85,6 +86,7 @@ test_libs = \ test_deps = \ $(noinst_LTLIBRARIES) \ ../lib-test/libtest.la \ + ../lib-settings/libsettings.la \ ../lib/liblib.la test_http_url_SOURCES = test-http-url.c diff --git a/src/lib-http/http-server-settings.c b/src/lib-http/http-server-settings.c new file mode 100644 index 0000000000..2154e6f701 --- /dev/null +++ b/src/lib-http/http-server-settings.c @@ -0,0 +1,82 @@ +/* Copyright (c) 2023 Dovecot authors, see the included COPYING file */ + +#include "lib.h" +#include "settings-parser.h" +#include "http-request.h" +#include "http-server.h" + +static bool +http_server_settings_check(void *_set, pool_t pool, const char **error_r); + +#undef DEF +#define DEF(type, name) \ + SETTING_DEFINE_STRUCT_##type("http_server_"#name, name, struct http_server_settings) + +#undef DEF_MSECS +#define DEF_MSECS(type, name) \ + SETTING_DEFINE_STRUCT_##type("http_server_"#name, name##_msecs, struct http_server_settings) + +static const struct setting_define http_server_setting_defines[] = { + SETTING_DEFINE_STRUCT_STR_HIDDEN("base_dir", base_dir, + struct http_server_settings), + DEF(STR, rawlog_dir), + DEF_MSECS(TIME_MSECS, max_client_idle_time), + DEF(UINT, max_pipelined_requests), + + DEF(SIZE_HIDDEN, request_max_target_length), + DEF(SIZE_HIDDEN, request_max_payload_size), + + DEF(SIZE_HIDDEN, request_hdr_max_size), + DEF(SIZE_HIDDEN, request_hdr_max_field_size), + DEF(UINT_HIDDEN, request_hdr_max_fields), + + DEF(STR_HIDDEN, default_host), + DEF(SIZE_HIDDEN, socket_send_buffer_size), + DEF(SIZE_HIDDEN, socket_recv_buffer_size), + SETTING_DEFINE_LIST_END +}; + +static const struct http_server_settings http_server_default_settings = { + .base_dir = PKG_RUNDIR, + + .rawlog_dir = "", + .max_client_idle_time_msecs = 0, + .max_pipelined_requests = 1, + + .request_max_target_length = 0, + .request_max_payload_size = HTTP_SERVER_DEFAULT_MAX_PAYLOAD_SIZE, + + .request_hdr_max_size = 0, + .request_hdr_max_field_size = 0, + .request_hdr_max_fields = 0, + + .default_host = "", + .socket_send_buffer_size = 0, + .socket_recv_buffer_size = 0, +}; + +const struct setting_parser_info http_server_setting_parser_info = { + .name = "http_server", + + .defines = http_server_setting_defines, + .defaults = &http_server_default_settings, + + .pool_offset1 = 1 + offsetof(struct http_server_settings, pool), + .struct_size = sizeof(struct http_server_settings), + .check_func = http_server_settings_check, +}; + +/* */ +static bool +http_server_settings_check(void *_set, pool_t pool ATTR_UNUSED, + const char **error_r) +{ + struct http_server_settings *set = _set; + + if (set->max_pipelined_requests == 0) { + *error_r = "http_server_max_pipelined_requests must not be 0"; + return FALSE; + } + return TRUE; +} +/* */ diff --git a/src/lib-http/http-server.h b/src/lib-http/http-server.h index d4be2fa967..2199cac285 100644 --- a/src/lib-http/http-server.h +++ b/src/lib-http/http-server.h @@ -13,15 +13,18 @@ struct http_request; struct http_server; struct http_server_resource; struct http_server_request; +struct http_server_request_limits; struct http_server_response; +#define HTTP_SERVER_DEFAULT_MAX_PAYLOAD_SIZE (1024 * 1024 * 1024 * 10ULL) + /* * Server settings */ struct http_server_settings { - const char *default_host; - + pool_t pool; + const char *base_dir; const char *rawlog_dir; /* SSL settings; if NULL, settings_get() is used automatically */ @@ -42,6 +45,8 @@ struct http_server_settings { uoff_t request_hdr_max_field_size; unsigned int request_hdr_max_fields; + /* Hidden settings */ + const char *default_host; /* The kernel send/receive buffer sizes used for the connection sockets. Configuring this is mainly useful for the test suite. The kernel defaults are used when these settings are 0. */ @@ -55,6 +60,9 @@ struct http_server_settings { bool debug; }; + +extern const struct setting_parser_info http_server_setting_parser_info; + /* * Response */