]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-http: Add http-server-settings.c
authorMarkus Valentin <markus.valentin@open-xchange.com>
Thu, 23 Nov 2023 13:20:52 +0000 (14:20 +0100)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Wed, 12 Feb 2025 10:34:12 +0000 (12:34 +0200)
src/lib-http/Makefile.am
src/lib-http/http-server-settings.c [new file with mode: 0644]
src/lib-http/http-server.h

index c4e9799b09a883c95d2df908ccec3d30361885eb..3a123d41b145bdc8d37eb3e1aee4cd57b67ad2e5 100644 (file)
@@ -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 (file)
index 0000000..2154e6f
--- /dev/null
@@ -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,
+};
+
+/* <settings checks> */
+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;
+}
+/* </settings checks> */
index d4be2fa967d2f9b2462185a4fad40433dd0a6846..2199cac2859744d1fef288c558b1c392db4fac79 100644 (file)
@@ -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
  */