From: Stephan Bosch Date: Fri, 8 Nov 2019 16:11:31 +0000 (+0100) Subject: lib-http: server: Add support for event API. X-Git-Tag: 2.3.11.2~331 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=99d37b1d052c1f522337a7502a12f3d18a059306;p=thirdparty%2Fdovecot%2Fcore.git lib-http: server: Add support for event API. --- diff --git a/src/lib-http/http-server-connection.c b/src/lib-http/http-server-connection.c index e0acaf72d3..ec394495cb 100644 --- a/src/lib-http/http-server-connection.c +++ b/src/lib-http/http-server-connection.c @@ -42,10 +42,8 @@ http_server_connection_debug(struct http_server_connection *conn, va_list args; if (conn->server->set.debug) { - va_start(args, format); - i_debug("http-server: conn %s: %s", - http_server_connection_label(conn), - t_strdup_vprintf(format, args)); + va_start(args, format); + e_debug(conn->event, "%s", t_strdup_vprintf(format, args)); va_end(args); } } @@ -61,9 +59,7 @@ http_server_connection_error(struct http_server_connection *conn, va_list args; va_start(args, format); - i_error("http-server: conn %s: %s", - http_server_connection_label(conn), - t_strdup_vprintf(format, args)); + e_error(conn->event, "%s", t_strdup_vprintf(format, args)); va_end(args); } @@ -78,9 +74,7 @@ http_server_connection_client_error(struct http_server_connection *conn, va_list args; va_start(args, format); - i_info("http-server: conn %s: %s", - http_server_connection_label(conn), - t_strdup_vprintf(format, args)); + e_info(conn->event, "%s", t_strdup_vprintf(format, args)); va_end(args); } @@ -662,6 +656,7 @@ static void http_server_connection_input(struct connection *_conn) conn->http_parser, req->pool, &req->req, &error_code, &error)) > 0) { conn->stats.request_count++; + http_server_request_update_event(req); http_server_connection_debug( conn, "Received new request %s " "(%u requests pending; %u maximum)", @@ -1100,6 +1095,7 @@ http_server_connection_create(struct http_server *server, { const struct http_server_settings *set = &server->set; struct http_server_connection *conn; + struct event *conn_event; i_assert(!server->shutting_down); @@ -1128,8 +1124,12 @@ http_server_connection_create(struct http_server *server, set->socket_recv_buffer_size); } + conn_event = event_create(server->event); + conn->conn.event_parent = conn_event; connection_init_server(server->conn_list, &conn->conn, NULL, fd_in, fd_out); + conn->event = conn->conn.event; + event_unref(&conn_event); if (!ssl) http_server_connection_ready(conn); diff --git a/src/lib-http/http-server-private.h b/src/lib-http/http-server-private.h index 44ec84ea72..4fa22f299f 100644 --- a/src/lib-http/http-server-private.h +++ b/src/lib-http/http-server-private.h @@ -63,6 +63,7 @@ struct http_server_payload_handler { struct http_server_response { struct http_server_request *request; + struct event *event; unsigned int status; const char *reason; @@ -98,6 +99,7 @@ struct http_server_request { unsigned int refcount; unsigned int id; int callback_refcount; + struct event *event; enum http_server_request_state state; @@ -124,6 +126,7 @@ struct http_server_request { struct http_server_connection { struct connection conn; struct http_server *server; + struct event *event; unsigned int refcount; const struct http_server_callbacks *callbacks; @@ -160,6 +163,7 @@ struct http_server { struct http_server_settings set; struct ioloop *ioloop; + struct event *event; struct ssl_iostream_context *ssl_ctx; struct connection_list *conn_list; @@ -195,6 +199,8 @@ http_server_request_version_equals(struct http_server_request *req, const char *http_server_request_label(struct http_server_request *req); +void http_server_request_update_event(struct http_server_request *req); + struct http_server_request * http_server_request_new(struct http_server_connection *conn); void http_server_request_destroy(struct http_server_request **_req); @@ -222,12 +228,6 @@ void http_server_payload_handler_switch_ioloop( * Connection */ -static inline const char * -http_server_connection_label(struct http_server_connection *conn) -{ - return conn->conn.label; -} - static inline void http_server_connection_add_request(struct http_server_connection *conn, struct http_server_request *sreq) diff --git a/src/lib-http/http-server-request.c b/src/lib-http/http-server-request.c index 9c7f33f87c..75d59bd2ee 100644 --- a/src/lib-http/http-server-request.c +++ b/src/lib-http/http-server-request.c @@ -24,9 +24,7 @@ http_server_request_debug(struct http_server_request *req, if (server->set.debug) { va_start(args, format); - i_debug("http-server: request %s: %s", - http_server_request_label(req), - t_strdup_vprintf(format, args)); + e_debug(req->event, "%s", t_strdup_vprintf(format, args)); va_end(args); } } @@ -42,9 +40,7 @@ http_server_request_error(struct http_server_request *req, va_list args; va_start(args, format); - i_error("http-server: request %s: %s", - http_server_request_label(req), - t_strdup_vprintf(format, args)); + e_error(req->event, "%s", t_strdup_vprintf(format, args)); va_end(args); } @@ -59,9 +55,7 @@ http_server_request_client_error(struct http_server_request *req, va_list args; va_start(args, format); - i_info("http-server: request %s: %s", - http_server_request_label(req), - t_strdup_vprintf(format, args)); + e_info(req->event, "%s", t_strdup_vprintf(format, args)); va_end(args); } @@ -81,6 +75,17 @@ const char *http_server_request_label(struct http_server_request *req) req->req.method, req->req.target_raw); } +void http_server_request_update_event(struct http_server_request *req) +{ + if (req->req.method != NULL) + event_add_str(req->event, "method", req->req.method); + if (req->req.target_raw != NULL) + event_add_str(req->event, "target", req->req.target_raw); + event_set_append_log_prefix( + req->event, t_strdup_printf("request %s: ", + http_server_request_label(req))); +} + struct http_server_request * http_server_request_new(struct http_server_connection *conn) { @@ -96,6 +101,8 @@ http_server_request_new(struct http_server_connection *conn) req->conn = conn; req->server = conn->server; req->id = ++id_counter; + req->event = event_create(conn->event); + http_server_request_update_event(req); http_server_connection_add_request(conn, req); return req; @@ -132,6 +139,7 @@ bool http_server_request_unref(struct http_server_request **_req) if (req->response != NULL) http_server_response_free(req->response); + event_unref(&req->event); pool_unref(&req->pool); return FALSE; } diff --git a/src/lib-http/http-server-response.c b/src/lib-http/http-server-response.c index 10c5808c6f..cfe9740d29 100644 --- a/src/lib-http/http-server-response.c +++ b/src/lib-http/http-server-response.c @@ -32,9 +32,7 @@ http_server_response_debug(struct http_server_response *resp, if (resp->request->server->set.debug) { va_start(args, format); - i_debug("http-server: request %s; %u response: %s", - http_server_request_label(resp->request), resp->status, - t_strdup_vprintf(format, args)); + e_debug(resp->event, "%s", t_strdup_vprintf(format, args)); va_end(args); } } @@ -50,9 +48,7 @@ http_server_response_error(struct http_server_response *resp, va_list args; va_start(args, format); - i_error("http-server: request %s; %u response: %s", - http_server_request_label(resp->request), resp->status, - t_strdup_vprintf(format, args)); + e_debug(resp->event, "%s", t_strdup_vprintf(format, args)); va_end(args); } @@ -60,6 +56,14 @@ http_server_response_error(struct http_server_response *resp, * Response */ +static void http_server_response_update_event(struct http_server_response *resp) +{ + event_add_int(resp->event, "status", resp->status); + event_set_append_log_prefix(resp->event, + t_strdup_printf("%u response: ", + resp->status)); +} + struct http_server_response * http_server_response_create(struct http_server_request *req, unsigned int status, const char *reason) @@ -91,6 +95,8 @@ http_server_response_create(struct http_server_request *req, resp->reason = p_strdup(req->pool, reason); resp->headers = str_new(default_pool, 256); resp->date = (time_t)-1; + resp->event = event_create(req->event); + http_server_response_update_event(resp); if (array_is_created(&resp->perm_headers)) { unsigned int i, count; @@ -110,6 +116,7 @@ void http_server_response_free(struct http_server_response *resp) i_stream_unref(&resp->payload_input); o_stream_unref(&resp->payload_output); + event_unref(&resp->event); str_free(&resp->headers); if (array_is_created(&resp->perm_headers)) { diff --git a/src/lib-http/http-server.c b/src/lib-http/http-server.c index 52940e8045..4fef8f42c4 100644 --- a/src/lib-http/http-server.c +++ b/src/lib-http/http-server.c @@ -16,6 +16,10 @@ #include "http-server-private.h" +static struct event_category event_category_http_server = { + .name = "http-server" +}; + /* * Server */ @@ -47,6 +51,11 @@ struct http_server *http_server_init(const struct http_server_settings *set) server->set.socket_recv_buffer_size = set->socket_recv_buffer_size; server->set.debug = set->debug; + server->event = event_create(set->event); + event_add_category(server->event, &event_category_http_server); + event_set_forced_debug(server->event, set->debug); + event_set_append_log_prefix(server->event, "http-server: "); + server->conn_list = http_server_connection_list_init(); return server; @@ -62,6 +71,7 @@ void http_server_deinit(struct http_server **_server) if (server->ssl_ctx != NULL) ssl_iostream_context_unref(&server->ssl_ctx); + event_unref(&server->event); pool_unref(&server->pool); } diff --git a/src/lib-http/http-server.h b/src/lib-http/http-server.h index e698efadcb..8b9fcb34dc 100644 --- a/src/lib-http/http-server.h +++ b/src/lib-http/http-server.h @@ -42,6 +42,9 @@ struct http_server_settings { size_t socket_send_buffer_size; size_t socket_recv_buffer_size; + /* Event to use for the http server. */ + struct event *event; + /* Enable logging debug messages */ bool debug; };