From: Markus Valentin Date: Mon, 4 Dec 2023 14:22:41 +0000 (+0100) Subject: lib-http: Use connection specific http-server settings X-Git-Tag: 2.4.1~1060 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9f8bb6cc3106f327bd9ef11e8478f7ab221f49ba;p=thirdparty%2Fdovecot%2Fcore.git lib-http: Use connection specific http-server settings --- diff --git a/src/lib-http/http-server-connection.c b/src/lib-http/http-server-connection.c index d97c06ff34..f1e41c14a7 100644 --- a/src/lib-http/http-server-connection.c +++ b/src/lib-http/http-server-connection.c @@ -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; diff --git a/src/lib-http/http-server-private.h b/src/lib-http/http-server-private.h index 881c5244a7..4d6a70ce68 100644 --- a/src/lib-http/http-server-private.h +++ b/src/lib-http/http-server-private.h @@ -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; diff --git a/src/lib-http/http-server.c b/src/lib-http/http-server.c index 8e655bec6a..1e61cdf062 100644 --- a/src/lib-http/http-server.c +++ b/src/lib-http/http-server.c @@ -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')