]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-http: server: Added some request debug logging.
authorStephan Bosch <stephan@rename-it.nl>
Wed, 10 Feb 2016 21:19:27 +0000 (22:19 +0100)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Thu, 11 Feb 2016 10:00:42 +0000 (12:00 +0200)
src/lib-http/http-server-private.h
src/lib-http/http-server-request.c

index 7ca16f522bc7cf010e613a1a36573fe60d0ba9e1..dcb47f32132500b2587164ed8df0e545d4ea7b3f 100644 (file)
@@ -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: <NEW>]", req->id);
+               return t_strdup_printf("[Req%u: %s <INCOMPLETE>]",
+                       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 *
index d6bf82bc1989c64f5bb2fad3bcea84fd5791485e..bf96c5d17684eb2e7567de1e4152151b5d47e50a 100644 (file)
@@ -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;