void http_client_request_add_header(struct http_client_request *req,
const char *key, const char *value)
{
+ 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 ||
}
if (req->headers == NULL)
req->headers = str_new(default_pool, 256);
- str_printfa(req->headers, "%s: %s\r\n", key, value);
+ 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 {
+ /* 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_remove_header(struct http_client_request *req,
req = http_client_request(client, "GET", "host", "target",
test_http_client_request_callback, NULL);
- /* add */
- http_client_request_add_header(req, "foo1", "value1");
- test_assert_strcmp(str_c(req->headers), "foo1: value1\r\n");
+ /* add the first */
+ http_client_request_add_header(req, "qwe", "value1");
+ test_assert_strcmp(str_c(req->headers), "qwe: value1\r\n");
- http_client_request_add_header(req, "foo1", "value2");
- test_assert_strcmp(str_c(req->headers), "foo1: value1\r\nfoo1: value2\r\n");
+ /* replace the first with the same length */
+ http_client_request_add_header(req, "qwe", "234567");
+ test_assert_strcmp(str_c(req->headers), "qwe: 234567\r\n");
- http_client_request_add_header(req, "foo2", "value3");
- test_assert_strcmp(str_c(req->headers), "foo1: value1\r\nfoo1: value2\r\nfoo2: value3\r\n");
+ /* replace the first with smaller length */
+ http_client_request_add_header(req, "qwe", "xyz");
+ test_assert_strcmp(str_c(req->headers), "qwe: xyz\r\n");
- /* remove */
- http_client_request_remove_header(req, "foo1");
- test_assert_strcmp(str_c(req->headers), "foo1: value2\r\nfoo2: value3\r\n");
+ /* replace the first with longer length */
+ http_client_request_add_header(req, "qwe", "abcdefg");
+ test_assert_strcmp(str_c(req->headers), "qwe: abcdefg\r\n");
- http_client_request_remove_header(req, "foo2");
- test_assert_strcmp(str_c(req->headers), "foo1: value2\r\n");
+ /* add the second */
+ http_client_request_add_header(req, "xyz", "1234");
+ test_assert_strcmp(str_c(req->headers), "qwe: abcdefg\r\nxyz: 1234\r\n");
- http_client_request_remove_header(req, "foo1");
+ /* replace second */
+ http_client_request_add_header(req, "xyz", "yuiop");
+ test_assert_strcmp(str_c(req->headers), "qwe: abcdefg\r\nxyz: yuiop\r\n");
+
+ /* replace the first again */
+ http_client_request_add_header(req, "qwe", "1234");
+ test_assert_strcmp(str_c(req->headers), "qwe: 1234\r\nxyz: yuiop\r\n");
+
+ /* remove the headers */
+ http_client_request_remove_header(req, "qwe");
+ test_assert_strcmp(str_c(req->headers), "xyz: yuiop\r\n");
+
+ http_client_request_remove_header(req, "xyz");
test_assert_strcmp(str_c(req->headers), "");
http_client_request_abort(&req);