]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-http: server: Add support for event API.
authorStephan Bosch <stephan.bosch@dovecot.fi>
Fri, 8 Nov 2019 16:11:31 +0000 (17:11 +0100)
committermartti.rannanjarvi <martti.rannanjarvi@open-xchange.com>
Sat, 18 Apr 2020 14:55:11 +0000 (14:55 +0000)
src/lib-http/http-server-connection.c
src/lib-http/http-server-private.h
src/lib-http/http-server-request.c
src/lib-http/http-server-response.c
src/lib-http/http-server.c
src/lib-http/http-server.h

index e0acaf72d344733f06cc94243ae2e0affa2cb9ed..ec394495cb03d17c690f62f0b03354f74ca28387 100644 (file)
@@ -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);
index 44ec84ea72c04b80a0e11f24bad3bbd214bf70fe..4fa22f299f471204ba155520b3bf880ffc9fc164 100644 (file)
@@ -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)
index 9c7f33f87cb7bfc9be1a171b2894b66073416fcd..75d59bd2eef798f843c33d920772ed930c838cc0 100644 (file)
@@ -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;
 }
index 10c5808c6f55328b114d1222caf45bda3da72525..cfe9740d29469feabd81258e7f29c01ff883a508 100644 (file)
@@ -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)) {
index 52940e804531c7966ea05b02dd8f69be986bd767..4fef8f42c4358c9e889596abb2c943b16e5a14e2 100644 (file)
 
 #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);
 }
 
index e698efadcbc5c028bc90a6e26b502025291cb656..8b9fcb34dc0e01daa295112ae3fa87828cd45e8d 100644 (file)
@@ -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;
 };