# HG changeset patch # User Timo Sirainen # Date 1558968397 -10800 # Node ID 727d9990373e626d282af8974aa13570f2a776e4 # Parent 7f2568b494acce3bc67823128bef8b0dd845c80d lib-http: http_client_request_remove_header() - split off header finding diff -r 7f2568b494ac -r 727d9990373e src/lib-http/http-client-request.c --- a/src/lib-http/http-client-request.c Fri Mar 15 00:14:05 2019 +0100 +++ b/src/lib-http/http-client-request.c Mon May 27 17:46:37 2019 +0300 @@ -333,6 +333,34 @@ req->preserve_exact_reason = TRUE; } +static bool +http_client_request_lookup_header_pos(struct http_client_request *req, + const char *key, + size_t *key_pos_r, size_t *value_pos_r, + size_t *next_pos_r) +{ + const unsigned char *data, *p; + size_t size, line_len; + size_t key_len = strlen(key); + + data = str_data(req->headers); + size = str_len(req->headers); + while ((p = memchr(data, '\n', size)) != NULL) { + line_len = (p+1) - data; + if (size > key_len && i_memcasecmp(data, key, key_len) == 0 && + data[key_len] == ':' && data[key_len+1] == ' ') { + /* key was found from header, replace its value */ + *key_pos_r = str_len(req->headers) - size; + *value_pos_r = *key_pos_r + key_len + 2; + *next_pos_r = *key_pos_r + line_len; + return TRUE; + } + size -= line_len; + data += line_len; + } + return FALSE; +} + void http_client_request_add_header(struct http_client_request *req, const char *key, const char *value) { @@ -388,29 +416,16 @@ void http_client_request_remove_header(struct http_client_request *req, const char *key) { - const unsigned char *data, *p; - size_t size, line_len, line_start_pos; - size_t key_len = strlen(key); + size_t key_pos, value_pos, next_pos; i_assert(req->state == HTTP_REQUEST_STATE_NEW || /* allow calling for retries */ req->state == HTTP_REQUEST_STATE_GOT_RESPONSE || req->state == HTTP_REQUEST_STATE_ABORTED); - data = str_data(req->headers); - size = str_len(req->headers); - while ((p = memchr(data, '\n', size)) != NULL) { - line_len = (p+1) - data; - if (size > key_len && i_memcasecmp(data, key, key_len) == 0 && - data[key_len] == ':' && data[key_len+1] == ' ') { - /* key was found from header, replace its value */ - line_start_pos = str_len(req->headers) - size; - str_delete(req->headers, line_start_pos, line_len); - break; - } - size -= line_len; - data += line_len; - } + if (http_client_request_lookup_header_pos(req, key, &key_pos, + &value_pos, &next_pos)) + str_delete(req->headers, key_pos, next_pos - key_pos); } void http_client_request_set_date(struct http_client_request *req,