]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-http: Use connection specific http-server settings
authorMarkus Valentin <markus.valentin@open-xchange.com>
Mon, 4 Dec 2023 14:22:41 +0000 (15:22 +0100)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Wed, 12 Feb 2025 10:34:12 +0000 (12:34 +0200)
src/lib-http/http-server-connection.c
src/lib-http/http-server-private.h
src/lib-http/http-server.c

index d97c06ff34f41bed361a3713b5e7b6bb74d9c1a2..f1e41c14a7ee250a1d6ad364940d0ef7173a4801 100644 (file)
@@ -17,6 +17,7 @@
 #include "http-date.h"
 #include "http-url.h"
 #include "http-request-parser.h"
+#include "settings.h"
 
 #include "http-server-private.h"
 
@@ -114,7 +115,7 @@ void http_server_connection_start_idle_timeout(
        struct http_server_connection *conn)
 {
        unsigned int timeout_msecs =
-               conn->server->set.max_client_idle_time_msecs;
+               conn->set->max_client_idle_time_msecs;
 
        if (conn->to_idle == NULL && timeout_msecs > 0) {
                conn->to_idle = timeout_add(timeout_msecs,
@@ -149,13 +150,13 @@ bool http_server_connection_shut_down(struct http_server_connection *conn)
 
 static void http_server_connection_ready(struct http_server_connection *conn)
 {
-       const struct http_server_settings *set = &conn->server->set;
+       const struct http_server_settings *set = conn->set;
        struct http_url base_url;
        struct stat st;
 
-       if (conn->server->set.rawlog_dir != NULL &&
-           stat(conn->server->set.rawlog_dir, &st) == 0) {
-               iostream_rawlog_create(conn->server->set.rawlog_dir,
+       if (set->rawlog_dir != NULL &&
+           stat(set->rawlog_dir, &st) == 0) {
+               iostream_rawlog_create(set->rawlog_dir,
                                       &conn->conn.input, &conn->conn.output);
        }
 
@@ -272,7 +273,7 @@ static bool
 http_server_connection_handle_request(struct http_server_connection *conn,
                                      struct http_server_request *req)
 {
-       const struct http_server_settings *set = &conn->server->set;
+       const struct http_server_settings *set = conn->set;
        unsigned int old_refcount;
        struct istream *payload;
 
@@ -368,13 +369,13 @@ http_server_connection_ssl_init(struct http_server_connection *conn)
        e_debug(conn->event, "Starting SSL handshake");
 
        http_server_connection_input_halt(conn);
-       if (server->set.ssl == NULL) {
+       if (conn->set->ssl == NULL) {
                ret = io_stream_autocreate_ssl_server(server->event,
                                                      &conn->conn.input,
                                                      &conn->conn.output,
                                                      &conn->ssl_iostream,
                                                      &error);
-       } else if (ssl_iostream_server_context_cache_get(server->set.ssl,
+       } else if (ssl_iostream_server_context_cache_get(conn->set->ssl,
                                                         &ssl_ctx, &error) < 0)
                ret = -1;
        else {
@@ -407,7 +408,7 @@ static bool
 http_server_connection_pipeline_is_full(struct http_server_connection *conn)
 {
        return ((conn->request_queue_count >=
-                conn->server->set.max_pipelined_requests) ||
+                conn->set->max_pipelined_requests) ||
                conn->server->shutting_down);
 }
 
@@ -422,7 +423,7 @@ http_server_connection_pipeline_handle_full(struct http_server_connection *conn)
                e_debug(conn->event, "Pipeline full "
                        "(%u requests pending; %u maximum)",
                        conn->request_queue_count,
-                       conn->server->set.max_pipelined_requests);
+                       conn->set->max_pipelined_requests);
        }
        http_server_connection_input_halt(conn);
 }
@@ -574,7 +575,7 @@ static void http_server_connection_input(struct connection *_conn)
        if (conn->request_queue_tail != NULL &&
            conn->request_queue_tail->state == HTTP_SERVER_REQUEST_STATE_NEW) {
                if (conn->request_queue_count >
-                   conn->server->set.max_pipelined_requests) {
+                   conn->set->max_pipelined_requests) {
                        /* Pipeline full */
                        http_server_connection_pipeline_handle_full(conn);
                        return;
@@ -583,7 +584,7 @@ static void http_server_connection_input(struct connection *_conn)
                req = conn->request_queue_tail;
        } else {
                if (conn->request_queue_count >=
-                   conn->server->set.max_pipelined_requests) {
+                   conn->set->max_pipelined_requests) {
                        /* Pipeline full */
                        http_server_connection_pipeline_handle_full(conn);
                        return;
@@ -829,7 +830,7 @@ http_server_connection_send_responses(struct http_server_connection *conn)
        /* Accept more requests if possible */
        if (conn->incoming_payload == NULL &&
            (conn->request_queue_count <
-            conn->server->set.max_pipelined_requests) &&
+            conn->set->max_pipelined_requests) &&
            !conn->server->shutting_down)
                http_server_connection_input_resume(conn);
 
@@ -978,7 +979,6 @@ http_server_connection_create(struct http_server *server,
                              const struct http_server_callbacks *callbacks,
                              void *context)
 {
-       const struct http_server_settings *set = &server->set;
        struct http_server_connection *conn;
        struct event *conn_event;
 
@@ -987,6 +987,8 @@ http_server_connection_create(struct http_server *server,
        conn = i_new(struct http_server_connection, 1);
        conn->refcount = 1;
        conn->server = server;
+       conn->set = &server->set;
+       pool_ref(server->set.pool);
        conn->ioloop = current_ioloop;
        conn->ssl = ssl;
        conn->callbacks = callbacks;
@@ -997,19 +999,19 @@ http_server_connection_create(struct http_server *server,
                net_set_nonblock(fd_out, TRUE);
        (void)net_set_tcp_nodelay(fd_out, TRUE);
 
-       if (set->socket_send_buffer_size > 0 &&
+       if (conn->set->socket_send_buffer_size > 0 &&
            net_set_send_buffer_size(fd_out,
-                                    set->socket_send_buffer_size) < 0) {
+                                    conn->set->socket_send_buffer_size) < 0) {
                e_error(conn->event,
                        "net_set_send_buffer_size(%zu) failed: %m",
-                       set->socket_send_buffer_size);
+                       conn->set->socket_send_buffer_size);
        }
-       if (set->socket_recv_buffer_size > 0 &&
+       if (conn->set->socket_recv_buffer_size > 0 &&
            net_set_recv_buffer_size(fd_in,
-                                    set->socket_recv_buffer_size) < 0) {
+                                    conn->set->socket_recv_buffer_size) < 0) {
                e_error(conn->event,
                        "net_set_recv_buffer_size(%zu) failed: %m",
-                       set->socket_recv_buffer_size);
+                       conn->set->socket_recv_buffer_size);
        }
 
        conn_event = event_create(server->event);
@@ -1102,6 +1104,7 @@ bool http_server_connection_unref(struct http_server_connection **_conn)
                                                    conn->disconnect_reason);
        } T_END;
 
+       settings_free(conn->set);
        i_free(conn->disconnect_reason);
        i_free(conn);
        return FALSE;
index 881c5244a73ba0fafdf68c2f26c0ba00d0d6e341..4d6a70ce68d2e4cd56b0b6b1da204c48b4178d5f 100644 (file)
@@ -126,6 +126,7 @@ struct http_server_request {
 struct http_server_connection {
        struct connection conn;
        struct http_server *server;
+       struct http_server_settings *set;
        struct ioloop *ioloop, *ioloop_switching;
        struct event *event;
        unsigned int refcount;
index 8e655bec6ac42516f298208be4bac2a8cbdace9c..1e61cdf06249f7e79cca778a5df09fa6506d7f05 100644 (file)
@@ -37,6 +37,8 @@ struct http_server *http_server_init(const struct http_server_settings *set,
        server = p_new(pool, struct http_server, 1);
        server->pool = pool;
 
+       if (server->set.pool == NULL)
+               server->set.pool = null_pool;
        if (set->default_host != NULL && *set->default_host != '\0')
                server->set.default_host = p_strdup(pool, set->default_host);
        if (set->rawlog_dir != NULL && *set->rawlog_dir != '\0')