From 15302e754e54a0333d0c54ff407493ae25b4923a Mon Sep 17 00:00:00 2001 From: Jessie Murray Date: Mon, 21 Feb 2022 18:55:44 -0800 Subject: [PATCH 1/2] Preserve header count when a value is replaced Fix for #217, a regression added in #205. The "header_count" field was incremented even when we overwrote a header entry, which caused Webdis to send a header with no name and no value. --- src/http.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/http.c b/src/http.c index 3e58aff..9da29e1 100644 --- a/src/http.c +++ b/src/http.c @@ -94,6 +94,7 @@ void http_response_set_header(struct http_response *r, const char *k, const char *v, header_copy copy) { int i, pos = r->header_count; + int replaced = 0; /* whether we overwrote a previous value */ size_t key_sz = strlen(k); size_t val_sz = strlen(v); @@ -104,6 +105,7 @@ http_response_set_header(struct http_response *r, const char *k, const char *v, /* free old value before replacing it. */ if(r->headers[i].copy & HEADER_COPY_KEY) free(r->headers[i].key); if(r->headers[i].copy & HEADER_COPY_VALUE) free(r->headers[i].val); + replaced = 1; break; } } @@ -116,7 +118,9 @@ http_response_set_header(struct http_response *r, const char *k, const char *v, sizeof(struct http_header)*(r->headers_array_size + 1)); r->headers_array_size++; } - r->header_count++; + if(!replaced) { + r->header_count++; + } /* copy key if needed */ if(copy & HEADER_COPY_KEY) { From 055363df46ba92946301224b806e369090d6d9aa Mon Sep 17 00:00:00 2001 From: Jessie Murray Date: Mon, 21 Feb 2022 19:11:36 -0800 Subject: [PATCH 2/2] Add test with curl for empty header (#217) --- tests/curl-tests.sh | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tests/curl-tests.sh b/tests/curl-tests.sh index adb59a4..f43aff6 100755 --- a/tests/curl-tests.sh +++ b/tests/curl-tests.sh @@ -25,4 +25,18 @@ function test_large_put_upload() { fi } +# GitHub issue #217 (empty header ":" returned for OPTIONS) +function test_options_headers() { + echo -n 'Sending an OPTIONS request... ' + empty_header_present=$(curl -v -X OPTIONS "http://127.0.0.1:7379/" 2>&1 | grep -cE '^< : ' || true) # || true to avoid false-positive exit code from grep + + if [[ $empty_header_present != 0 ]]; then + echo "failed! Found an empty header entry" + exit 1 + else + echo 'OK' + fi +} + test_large_put_upload +test_options_headers