From: Siavash Tavakoli Date: Mon, 27 Sep 2021 23:28:35 +0000 (+0100) Subject: lib-http: http-server: Add request events X-Git-Tag: 2.3.18~383 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c92afe67a13de9582567e9c16664c9b596ab2f95;p=thirdparty%2Fdovecot%2Fcore.git lib-http: http-server: Add request events Adds http_server_request_started and http_server_request_finished. --- diff --git a/src/lib-http/http-server-connection.c b/src/lib-http/http-server-connection.c index 4605cd8fef..801a7037f1 100644 --- a/src/lib-http/http-server-connection.c +++ b/src/lib-http/http-server-connection.c @@ -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 { diff --git a/src/lib-http/http-server-private.h b/src/lib-http/http-server-private.h index b6db99f4eb..c07d873e73 100644 --- a/src/lib-http/http-server-private.h +++ b/src/lib-http/http-server-private.h @@ -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); diff --git a/src/lib-http/http-server-request.c b/src/lib-http/http-server-request.c index 4ba5c27afa..df2ce1af4b 100644 --- a/src/lib-http/http-server-request.c +++ b/src/lib-http/http-server-request.c @@ -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,