changeset 19745:b445fef19092

lib-http: server: Added some request debug logging.
author Stephan Bosch <stephan@rename-it.nl>
date Wed, 10 Feb 2016 22:19:27 +0100
parents 2ca3b2969ad8
children 7527051eb56a
files src/lib-http/http-server-private.h src/lib-http/http-server-request.c
diffstat 2 files changed, 47 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-http/http-server-private.h	Wed Feb 10 22:17:07 2016 +0100
+++ b/src/lib-http/http-server-private.h	Wed Feb 10 22:19:27 2016 +0100
@@ -69,6 +69,7 @@
 	struct http_request req;
 	pool_t pool;
 	unsigned int refcount;
+	unsigned int id;
 
 	enum http_server_request_state state;
 
@@ -134,9 +135,14 @@
 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 *
--- a/src/lib-http/http-server-request.c	Wed Feb 10 22:17:07 2016 +0100
+++ b/src/lib-http/http-server-request.c	Wed Feb 10 22:19:27 2016 +0100
@@ -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 @@
 	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 @@
 	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 @@
 {
 	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 @@
 	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 @@
 	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;