From: Timo Sirainen Date: Tue, 3 Dec 2019 14:26:42 +0000 (+0200) Subject: lib-http: Add http_client_request_set_event_headers() X-Git-Tag: 2.3.10~186 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=318f7eb4caa97ec13d3b352b1bdee4e9b8f7d9e4;p=thirdparty%2Fdovecot%2Fcore.git lib-http: Add http_client_request_set_event_headers() --- diff --git a/src/lib-http/http-client-connection.c b/src/lib-http/http-client-connection.c index 906c3224b9..79a7a021bd 100644 --- a/src/lib-http/http-client-connection.c +++ b/src/lib-http/http-client-connection.c @@ -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)); diff --git a/src/lib-http/http-client-private.h b/src/lib-http/http-client-private.h index bc49a5477b..18a1613cd6 100644 --- a/src/lib-http/http-client-private.h +++ b/src/lib-http/http-client-private.h @@ -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; diff --git a/src/lib-http/http-client-request.c b/src/lib-http/http-client-request.c index ac32c8a935..aa598813c4 100644 --- a/src/lib-http/http-client-request.c +++ b/src/lib-http/http-client-request.c @@ -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) { diff --git a/src/lib-http/http-client.h b/src/lib-http/http-client.h index 181fd15183..26289b670b 100644 --- a/src/lib-http/http-client.h +++ b/src/lib-http/http-client.h @@ -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.