changeset 23010:727d9990373e

lib-http: http_client_request_remove_header() - split off header finding
author Timo Sirainen <timo.sirainen@open-xchange.com>
date Mon, 27 May 2019 17:46:37 +0300
parents 7f2568b494ac
children 4ea1e4f22a7b
files src/lib-http/http-client-request.c
diffstat 1 files changed, 32 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- 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,