]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-http: Add http_client_request_set_event_headers()
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Tue, 3 Dec 2019 14:26:42 +0000 (16:26 +0200)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Fri, 13 Dec 2019 13:14:23 +0000 (13:14 +0000)
src/lib-http/http-client-connection.c
src/lib-http/http-client-private.h
src/lib-http/http-client-request.c
src/lib-http/http-client.h

index 906c3224b94cfe71f8f831b65ee83fdbdaa1e676..79a7a021bd1d20eb7776a6ed6ac2e3d2794106b7 100644 (file)
@@ -932,6 +932,31 @@ http_client_connection_return_response(
        return FALSE;
 }
 
+static const char *
+http_client_request_add_event_headers(struct http_client_request *req,
+                                     const struct http_response *response)
+{
+       if (req->event_headers == NULL)
+               return "";
+
+       string_t *str = t_str_new(128);
+       for (unsigned int i = 0; req->event_headers[i] != NULL; i++) {
+               const char *hdr_name = req->event_headers[i];
+               const char *value = http_response_header_get(response, hdr_name);
+
+               if (value == NULL)
+                       continue;
+
+               str_append(str, str_len(str) == 0 ? " (" : ", ");
+               event_add_str(req->event,
+                             t_strconcat("http_hdr_", hdr_name, NULL), value);
+               str_printfa(str, "%s:%s", hdr_name, value);
+       }
+       if (str_len(str) > 0)
+               str_append_c(str, ')');
+       return str_c(str);
+}
+
 static void http_client_connection_input(struct connection *_conn)
 {
        struct http_client_connection *conn =
@@ -1096,10 +1121,12 @@ static void http_client_connection_input(struct connection *_conn)
                        conn->output_broken = early = TRUE;
                }
 
+               const char *suffix =
+                       http_client_request_add_event_headers(req, &response);
                e_debug(conn->event,
-                       "Got %u response for request %s: %s (took %u ms + %u ms in queue)",
+                       "Got %u response for request %s: %s%s (took %u ms + %u ms in queue)",
                        response.status, http_client_request_label(req),
-                       response.reason,
+                       response.reason, suffix,
                        timeval_diff_msecs(&req->response_time, &req->sent_time),
                        timeval_diff_msecs(&req->sent_time, &req->submit_time));
 
index bc49a5477bfdf07c00724ed383eeab42d53c1dff..18a1613cd676c76a7521ffb6015729237b51ad5b 100644 (file)
@@ -99,6 +99,7 @@ struct http_client_request {
        struct http_client_connection *conn;
 
        struct event *event;
+       const char *const *event_headers;
        unsigned int last_status;
 
        string_t *headers;
index ac32c8a9356b409c696c3fa0de55ce8aef971476..aa598813c487179c67eeeec0c23894acc2b496f6 100644 (file)
@@ -620,6 +620,12 @@ void http_client_request_set_max_attempts(struct http_client_request *req,
        req->max_attempts = max_attempts;
 }
 
+void http_client_request_set_event_headers(struct http_client_request *req,
+                                          const char *const *headers)
+{
+       req->event_headers = p_strarray_dup(req->pool, headers);
+}
+
 void http_client_request_set_auth_simple(struct http_client_request *req,
        const char *username, const char *password)
 {
index 181fd15183eb3f6eb14b20734ff527b090b1662a..26289b670b4c210cc63aea4bfbd2195024535b1f 100644 (file)
@@ -351,6 +351,11 @@ void http_client_request_set_attempt_timeout_msecs(struct http_client_request *r
 void http_client_request_set_max_attempts(struct http_client_request *req,
        unsigned int max_attempts);
 
+/* Include the specified HTTP response headers in the http_request_finished
+   event parameters with "http_hdr_" prefix. */
+void http_client_request_set_event_headers(struct http_client_request *req,
+                                          const char *const *headers);
+
 /* set the username:password credentials for this request for simple
    authentication. This function is meant for simple schemes that use a
    password. More complex schemes will need to be handled manually.