diff --git a/src/lib-http/http-server-private.h b/src/lib-http/http-server-private.h index 7ca16f522b..dcb47f3213 100644 --- a/src/lib-http/http-server-private.h +++ b/src/lib-http/http-server-private.h @@ -69,6 +69,7 @@ struct http_server_request { struct http_request req; pool_t pool; unsigned int refcount; + unsigned int id; enum http_server_request_state state; @@ -134,9 +135,14 @@ struct http_server { static inline const char * http_server_request_label(struct http_server_request *req) { - if (req->req.method == NULL || req->req.target_raw == NULL) - return "[INVALID]"; - return t_strdup_printf("[%s %s]", req->req.method, req->req.target_raw); + if (req->req.method == NULL) { + if (req->req.target_raw == NULL) + return t_strdup_printf("[Req%u: ]", req->id); + return t_strdup_printf("[Req%u: %s ]", + req->id, req->req.method); + } + return t_strdup_printf("[Req%u: %s %s]", req->id, + req->req.method, req->req.target_raw); } static inline const char * diff --git a/src/lib-http/http-server-request.c b/src/lib-http/http-server-request.c index d6bf82bc19..bf96c5d176 100644 --- a/src/lib-http/http-server-request.c +++ b/src/lib-http/http-server-request.c @@ -4,9 +4,38 @@ #include "http-server-private.h" +/* + * Logging + */ + +static inline void +http_server_request_debug(struct http_server_request *req, + const char *format, ...) ATTR_FORMAT(2, 3); + +static inline void +http_server_request_debug(struct http_server_request *req, + const char *format, ...) +{ + struct http_server *server = req->server; + va_list args; + + 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)); + va_end(args); + } +} + +/* + * Request + */ + struct http_server_request * http_server_request_new(struct http_server_connection *conn) { + static unsigned int id_counter = 0; pool_t pool; struct http_server_request *req; @@ -16,6 +45,7 @@ http_server_request_new(struct http_server_connection *conn) req->refcount = 1; req->conn = conn; req->server = conn->server; + req->id = ++id_counter; http_server_connection_add_request(conn, req); return req; @@ -36,6 +66,8 @@ bool http_server_request_unref(struct http_server_request **_req) if (--req->refcount > 0) return TRUE; + http_server_request_debug(req, "Free"); + if (req->state < HTTP_SERVER_REQUEST_STATE_FINISHED) { req->state = HTTP_SERVER_REQUEST_STATE_ABORTED; http_server_connection_remove_request(conn, req); @@ -57,6 +89,8 @@ void http_server_request_destroy(struct http_server_request **_req) { struct http_server_request *req = *_req; + http_server_request_debug(req, "Destroy"); + if (req->delay_destroy) { req->destroy_pending = TRUE; } else if (req->destroy_callback != NULL) { @@ -81,6 +115,8 @@ void http_server_request_abort(struct http_server_request **_req) struct http_server_request *req = *_req; struct http_server_connection *conn = req->conn; + http_server_request_debug(req, "Abort"); + if (req->state < HTTP_SERVER_REQUEST_STATE_FINISHED) { req->state = HTTP_SERVER_REQUEST_STATE_ABORTED; http_server_connection_remove_request(conn, req); @@ -185,6 +221,8 @@ 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; + http_server_request_debug(req, "Finished"); + i_assert(req->state < HTTP_SERVER_REQUEST_STATE_FINISHED); req->state = HTTP_SERVER_REQUEST_STATE_FINISHED;