]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-http: Added http_client_request_remove_header()
authorTimo Sirainen <tss@iki.fi>
Tue, 14 Jan 2014 22:28:35 +0000 (00:28 +0200)
committerTimo Sirainen <tss@iki.fi>
Tue, 14 Jan 2014 22:28:35 +0000 (00:28 +0200)
src/lib-http/http-client-request.c
src/lib-http/http-client.h

index c03c2ef1c3aab42450d99eeda48ffb511a193bc9..b3ec195a1c53a4966dbe8db6c1b28a38d12d9048 100644 (file)
@@ -240,6 +240,34 @@ void http_client_request_add_header(struct http_client_request *req,
        str_printfa(req->headers, "%s: %s\r\n", key, value);
 }
 
+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;
+       unsigned int key_len = strlen(key);
+
+       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;
+       }
+}
+
 void http_client_request_set_date(struct http_client_request *req,
                                    time_t date)
 {
index 1fad9c3457b1a316b3887792c78f9c96dbc6a963..d0032906b49e7da61403c038b635f486423a5bfb 100644 (file)
@@ -172,6 +172,8 @@ void http_client_request_set_urgent(struct http_client_request *req);
 
 void http_client_request_add_header(struct http_client_request *req,
                                    const char *key, const char *value);
+void http_client_request_remove_header(struct http_client_request *req,
+                                      const char *key);
 void http_client_request_set_date(struct http_client_request *req,
                                    time_t date);