From 98c94596f5928840177b6bd3c7b0f0dd03a431af Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Thu, 20 Aug 2020 00:34:44 +0200 Subject: etag: save and use the full received contents ... which makes it support weak tags and non-standard etags too! Added test case 347 to verify blank incoming ETag: Fixes #5610 Closes #5833 --- src/tool_cb_hdr.c | 56 ++++++++++++-------------------------------- src/tool_operate.c | 2 +- tests/data/Makefile.inc | 2 +- tests/data/test1566 | 2 +- tests/data/test339 | 4 ++-- tests/data/test342 | 2 +- tests/data/test343 | 4 ++-- tests/data/test344 | 2 +- tests/data/test345 | 4 ++-- tests/data/test347 | 62 +++++++++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 88 insertions(+), 52 deletions(-) create mode 100644 tests/data/test347 diff --git a/src/tool_cb_hdr.c b/src/tool_cb_hdr.c index 5741f0aba..ee3ef7390 100644 --- a/src/tool_cb_hdr.c +++ b/src/tool_cb_hdr.c @@ -98,53 +98,27 @@ size_t tool_header_cb(char *ptr, size_t size, size_t nmemb, void *userdata) /* * Write etag to file when --etag-save option is given. - * etag string that we want is enveloped in double quotes */ if(per->config->etag_save_file && etag_save->stream) { /* match only header that start with etag (case insensitive) */ if(curl_strnequal(str, "etag:", 5)) { - char *etag_h = NULL; - char *first = NULL; - char *last = NULL; - size_t etag_length = 0; - - etag_h = ptr; - /* point to first occurrence of double quote */ - first = memchr(etag_h, '\"', cb); - - /* - * if server side messed with the etag header and doesn't include - * double quotes around the etag, kindly exit with a warning - */ - - if(!first) { - warnf(per->config->global, - "Received header etag is missing double quote/s\n"); - return failure; - } - else { - /* discard first double quote */ - first++; - } - - /* point to last occurrence of double quote */ - last = memchr(first, '\"', cb); - - if(!last) { - warnf(per->config->global, - "Received header etag is missing double quote/s\n"); - return failure; + const char *etag_h = &str[5]; + const char *eot = end - 1; + if(*eot == '\n') { + while(ISSPACE(*etag_h) && (etag_h < eot)) + etag_h++; + while(ISSPACE(*eot)) + eot--; + + if(eot >= etag_h) { + size_t etag_length = eot - etag_h + 1; + fwrite(etag_h, size, etag_length, etag_save->stream); + /* terminate with newline */ + fputc('\n', etag_save->stream); + (void)fflush(etag_save->stream); + } } - - /* get length of desired etag */ - etag_length = (size_t)last - (size_t)first; - - fwrite(first, size, etag_length, etag_save->stream); - /* terminate with new line */ - fputc('\n', etag_save->stream); } - - (void)fflush(etag_save->stream); } /* diff --git a/src/tool_operate.c b/src/tool_operate.c index ad4e85dd8..3936315a9 100644 --- a/src/tool_operate.c +++ b/src/tool_operate.c @@ -922,7 +922,7 @@ static CURLcode single_transfer(struct GlobalConfig *global, if((PARAM_OK == file2string(&etag_from_file, file)) && etag_from_file) { - header = aprintf("If-None-Match: \"%s\"", etag_from_file); + header = aprintf("If-None-Match: %s", etag_from_file); Curl_safefree(etag_from_file); } else diff --git a/tests/data/Makefile.inc b/tests/data/Makefile.inc index 3752502ef..9261ee221 100644 --- a/tests/data/Makefile.inc +++ b/tests/data/Makefile.inc @@ -58,7 +58,7 @@ test307 test308 test309 test310 test311 test312 test313 test314 test315 \ test316 test317 test318 test319 test320 test321 test322 test323 test324 \ test325 test326 test327 test328 test329 test330 test331 test332 test333 \ test334 test335 test336 test337 test338 test339 test340 test341 test342 \ -test343 test344 test345 test346 \ +test343 test344 test345 test346 test347 \ test350 test351 test352 test353 test354 test355 test356 test357 test358 \ test359 \ test393 test394 test395 test396 test397 \ diff --git a/tests/data/test1566 b/tests/data/test1566 index e6f81711d..cc3ac474a 100644 --- a/tests/data/test1566 +++ b/tests/data/test1566 @@ -35,7 +35,7 @@ http http://%HOSTIP:%HTTPPORT/1566 -o log/output1566 --etag-compare log/etag1566 -123456 +"123456" downloaded already diff --git a/tests/data/test339 b/tests/data/test339 index cd6e49892..8da212e55 100644 --- a/tests/data/test339 +++ b/tests/data/test339 @@ -14,7 +14,7 @@ Server: fakeit/0.9 fakeitbad/1.0 Transfer-Encoding: chunked Trailer: chunky-trailer Connection: mooo -ETag: "asdf" +ETag: W/"asdf" 40 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -56,7 +56,7 @@ Accept: */* -asdf +W/"asdf" diff --git a/tests/data/test342 b/tests/data/test342 index 95297ba50..75295cfa8 100644 --- a/tests/data/test342 +++ b/tests/data/test342 @@ -34,7 +34,7 @@ http Check if --etag-compare set correct etag in header -21025-dc7-39462498 +"21025-dc7-39462498" http://%HOSTIP:%HTTPPORT/342 --etag-compare log/etag342 diff --git a/tests/data/test343 b/tests/data/test343 index e55a181d8..5d877827f 100644 --- a/tests/data/test343 +++ b/tests/data/test343 @@ -34,7 +34,7 @@ http Both --etag-compare and --etag-save to save new Etag -21025-dc7-39462498 +"21025-dc7-39462498" http://%HOSTIP:%HTTPPORT/343 --etag-compare log/etag343 --etag-save log/out343 @@ -55,7 +55,7 @@ If-None-Match: "21025-dc7-39462498" -21025-dc7-11111 +"21025-dc7-11111" diff --git a/tests/data/test344 b/tests/data/test344 index 054d0351b..2b730d524 100644 --- a/tests/data/test344 +++ b/tests/data/test344 @@ -52,7 +52,7 @@ If-None-Match: "" -21025-dc7-11111 +"21025-dc7-11111" diff --git a/tests/data/test345 b/tests/data/test345 index 135e0c26a..c30c06de9 100644 --- a/tests/data/test345 +++ b/tests/data/test345 @@ -34,7 +34,7 @@ http Both --etag-compare and -save store new Etag using one pre-existing file -21025-dc7-39462498 +"21025-dc7-39462498" http://%HOSTIP:%HTTPPORT/345 --etag-compare log/etag345 --etag-save log/etag345 @@ -55,7 +55,7 @@ If-None-Match: "21025-dc7-39462498" -21025-dc7-11111 +"21025-dc7-11111" diff --git a/tests/data/test347 b/tests/data/test347 new file mode 100644 index 000000000..702c270f9 --- /dev/null +++ b/tests/data/test347 @@ -0,0 +1,62 @@ + + + +HTTP +HTTP GET + + +# +# Server-side + + +HTTP/1.1 200 funky chunky! +Server: fakeit/0.9 fakeitbad/1.0 +Transfer-Encoding: chunked +Trailer: chunky-trailer +Connection: mooo +ETag: + +40 +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +30 +bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb +21;heresatest=moooo +cccccccccccccccccccccccccccccccc + +0 +chunky-trailer: header data + + + + +# +# Client-side + + +http + + +--etag-save with blank incoming header + + +http://%HOSTIP:%HTTPPORT/347 --etag-save log/etag347 + + + +# +# Verify data after the test has been "shot" + + +^User-Agent:.* + + +GET /347 HTTP/1.1 +Host: %HOSTIP:%HTTPPORT +Accept: */* + + + + + + + -- cgit v1.2.1