]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-http: Add http_client_request_add_missing_header()
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Mon, 27 May 2019 15:25:38 +0000 (18:25 +0300)
committerTimo Sirainen <timo.sirainen@open-xchange.com>
Mon, 27 May 2019 15:25:38 +0000 (18:25 +0300)
src/lib-http/http-client-request.c
src/lib-http/http-client.h
src/lib-http/test-http-client-request.c

index a38a91795d7f1849d75340734f609a0f132c849d..6899f66bdfc1db364c6d7da9bcf2ba8ce387771a 100644 (file)
@@ -420,8 +420,10 @@ http_client_request_lookup_header_pos(struct http_client_request *req,
        return FALSE;
 }
 
-void http_client_request_add_header(struct http_client_request *req,
-                                   const char *key, const char *value)
+static void
+http_client_request_add_header_full(struct http_client_request *req,
+                                   const char *key, const char *value,
+                                   bool replace_existing)
 {
        size_t key_pos, value_pos, next_pos;
 
@@ -474,13 +476,25 @@ void http_client_request_add_header(struct http_client_request *req,
        if (!http_client_request_lookup_header_pos(req, key, &key_pos,
                                                   &value_pos, &next_pos))
                str_printfa(req->headers, "%s: %s\r\n", key, value);
-       else {
+       else if (replace_existing) {
                /* don't delete CRLF */
                size_t old_value_len = next_pos - value_pos - 2;
                str_replace(req->headers, value_pos, old_value_len, value);
        }
 }
 
+void http_client_request_add_header(struct http_client_request *req,
+                                   const char *key, const char *value)
+{
+       http_client_request_add_header_full(req, key, value, TRUE);
+}
+
+void http_client_request_add_missing_header(struct http_client_request *req,
+                                           const char *key, const char *value)
+{
+       http_client_request_add_header_full(req, key, value, FALSE);
+}
+
 void http_client_request_remove_header(struct http_client_request *req,
                                       const char *key)
 {
index 1d5fa52ad8ee5cc2f811f8ff4697b4195931be3b..82426bad844b51a58c0967fccf0fd77148874f2a 100644 (file)
@@ -297,6 +297,9 @@ void http_client_request_set_preserve_exact_reason(struct http_client_request *r
    the value is replaced. */
 void http_client_request_add_header(struct http_client_request *req,
                                    const char *key, const char *value);
+/* add a custom header to the request. Do nothing if it was already added. */
+void http_client_request_add_missing_header(struct http_client_request *req,
+                                           const char *key, const char *value);
 /* remove a header added earlier. This has no influence on implicitly created
    headers. */
 void http_client_request_remove_header(struct http_client_request *req,
index 344e0ad10fecd57dc1fa7f7510f8bacc219fb80e..5b6fa93f53d835c21c05e890dd483c9f22a6905c 100644 (file)
@@ -74,6 +74,12 @@ static void test_http_client_request_headers(void)
        test_assert(http_client_request_lookup_header(req, "xyz") == NULL);
        test_assert_strcmp(str_c(req->headers), "");
 
+       /* test _add_missing_header() */
+       http_client_request_add_missing_header(req, "foo", "bar");
+       test_assert_strcmp(str_c(req->headers), "foo: bar\r\n");
+       http_client_request_add_missing_header(req, "foo", "123");
+       test_assert_strcmp(str_c(req->headers), "foo: bar\r\n");
+
        http_client_request_abort(&req);
        http_client_deinit(&client);
        test_end();