]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-http: http-server: Add request events
authorSiavash Tavakoli <siavash.tavakoli@open-xchange.com>
Mon, 27 Sep 2021 23:28:35 +0000 (00:28 +0100)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Wed, 29 Sep 2021 05:44:38 +0000 (05:44 +0000)
Adds http_server_request_started and http_server_request_finished.

src/lib-http/http-server-connection.c
src/lib-http/http-server-private.h
src/lib-http/http-server-request.c

index 4605cd8fefeeccb39c8aca044ec45cd4c85aefaf..801a7037f1061f2f46ccc071e8f4413112be92a3 100644 (file)
@@ -591,12 +591,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);
-                       e_debug(conn->event, "Received new request %s "
-                               "(%u requests pending; %u maximum)",
-                               http_server_request_label(req),
-                               conn->request_queue_count,
-                               conn->server->set.max_pipelined_requests);
+                       http_server_request_received(req);
 
                        http_server_request_immune_ref(req);
                        T_BEGIN {
index b6db99f4eb8d6d390cc1bf246575c73bb1ef8766..c07d873e736cd83c92d314401dc78c20291139ac 100644 (file)
@@ -100,6 +100,7 @@ struct http_server_request {
        unsigned int id;
        int callback_refcount;
        struct event *event;
+       uoff_t input_start_offset, output_start_offset;
 
        enum http_server_request_state state;
 
@@ -265,6 +266,7 @@ void http_server_request_immune_unref(struct http_server_request **_req);
 
 bool http_server_request_is_complete(struct http_server_request *req);
 
+void http_server_request_received(struct http_server_request *req);
 void http_server_request_callback(struct http_server_request *req);
 
 void http_server_request_halt_payload(struct http_server_request *req);
index 4ba5c27afab0d8b9cfa5673ba99ee0e52941b7aa..df2ce1af4b1f480bc6b51082fd1a11e87dae5d8b 100644 (file)
@@ -72,6 +72,8 @@ http_server_request_new(struct http_server_connection *conn)
        req->server = conn->server;
        req->id = ++id_counter;
        req->event = event_create(conn->event);
+       req->input_start_offset = conn->conn.input->v_offset;
+       req->output_start_offset = conn->conn.output->offset;
        http_server_request_update_event(req);
 
        http_server_connection_add_request(conn, req);
@@ -327,6 +329,18 @@ http_server_request_default_handler(struct http_server_request *req)
        return;
 }
 
+void http_server_request_received(struct http_server_request *req)
+{
+       http_server_request_update_event(req);
+       struct event_passthrough *e = event_create_passthrough(req->event)->
+               set_name("http_server_request_started");
+       e_debug(e->event(), "Received new request %s "
+               "(%u requests pending; %u maximum)",
+               http_server_request_label(req),
+               req->conn->request_queue_count,
+               req->conn->server->set.max_pipelined_requests);
+}
+
 void http_server_request_callback(struct http_server_request *req)
 {
        struct http_server_connection *conn = req->conn;
@@ -404,8 +418,6 @@ void http_server_request_finished(struct http_server_request *req)
        http_server_tunnel_callback_t tunnel_callback = resp->tunnel_callback;
        void *tunnel_context = resp->tunnel_context;
 
-       e_debug(req->event, "Finished");
-
        i_assert(req->state < HTTP_SERVER_REQUEST_STATE_FINISHED);
        req->state = HTTP_SERVER_REQUEST_STATE_FINISHED;
 
@@ -415,6 +427,16 @@ void http_server_request_finished(struct http_server_request *req)
        if (req->response != NULL)
                http_server_response_request_finished(req->response);
 
+       uoff_t bytes_in = req->conn->conn.input->v_offset -
+                         req->input_start_offset;
+       uoff_t bytes_out = req->conn->conn.output->offset -
+                          req->output_start_offset;
+       struct event_passthrough *e = event_create_passthrough(req->event)->
+               set_name("http_server_request_finished")->
+               add_int("bytes_in", bytes_in)->
+               add_int("bytes_out", bytes_out);
+       e_debug(e->event(), "Finished request");
+
        if (tunnel_callback == NULL) {
                if (req->connection_close) {
                        http_server_connection_close(&conn,