From: Gusted Date: Sat, 20 Apr 2024 16:44:42 +0000 (+0200) Subject: tool_operate: don't truncate the etag save file by default X-Git-Tag: curl-8_8_0~169 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=00bef95946d35115376cedac9a64df22e3b202ab;p=thirdparty%2Fcurl.git tool_operate: don't truncate the etag save file by default This fixes a regression of 75d79a4486b279100209ddf8c7fdb12955fb66e9. The code in tool-operate truncated the etag save file, under the assumption that the file would be written with a new etag value. However since 75d79a4486b279100209ddf8c7fdb12955fb66e9 that might not be the case anymore and could result in the file being truncated when --etag-compare and --etag-save was used and that the etag value matched with what the server responded. Instead the truncation should not be done when a new etag value should be written. Test 3204 was added to verify that the file with the etag value doesn't change the contents when used by --etag-compare and --etage-save and that value matches with what the server returns on a non 2xx response. Closes #13432 --- diff --git a/src/tool_cb_hdr.c b/src/tool_cb_hdr.c index a64654eaf6..21407aa209 100644 --- a/src/tool_cb_hdr.c +++ b/src/tool_cb_hdr.c @@ -24,6 +24,9 @@ #include "tool_setup.h" #include "strcase.h" +#ifdef HAVE_UNISTD_H +#include +#endif #define ENABLE_CURLX_PRINTF /* use our own printf() functions */ @@ -130,6 +133,19 @@ size_t tool_header_cb(char *ptr, size_t size, size_t nmemb, void *userdata) if(eot >= etag_h) { size_t etag_length = eot - etag_h + 1; + /* + * Truncate the etag save stream, it can have an existing etag value. + */ +#ifdef HAVE_FTRUNCATE + if(ftruncate(fileno(etag_save->stream), 0)) { + return CURL_WRITEFUNC_ERROR; + } +#else + if(fseek(etag_save->stream, 0, SEEK_SET)) { + return CURL_WRITEFUNC_ERROR; + } +#endif + fwrite(etag_h, size, etag_length, etag_save->stream); /* terminate with newline */ fputc('\n', etag_save->stream); diff --git a/src/tool_operate.c b/src/tool_operate.c index eb29dcd365..77b2dbd2f0 100644 --- a/src/tool_operate.c +++ b/src/tool_operate.c @@ -925,7 +925,7 @@ static CURLcode single_transfer(struct GlobalConfig *global, if(config->etag_save_file) { /* open file for output: */ if(strcmp(config->etag_save_file, "-")) { - FILE *newfile = fopen(config->etag_save_file, "wb"); + FILE *newfile = fopen(config->etag_save_file, "ab"); if(!newfile) { warnf(global, "Failed creating file for saving etags: \"%s\". " "Skip this transfer", config->etag_save_file); diff --git a/tests/data/Makefile.inc b/tests/data/Makefile.inc index fb94dd002a..b891c1154c 100644 --- a/tests/data/Makefile.inc +++ b/tests/data/Makefile.inc @@ -261,4 +261,4 @@ test3024 test3025 test3026 test3027 test3028 test3029 test3030 \ \ test3100 test3101 test3102 test3103 \ test3200 \ -test3201 test3202 test3203 +test3201 test3202 test3203 test3204 diff --git a/tests/data/test3204 b/tests/data/test3204 new file mode 100644 index 0000000000..8cc9c2f5b5 --- /dev/null +++ b/tests/data/test3204 @@ -0,0 +1,52 @@ + + + +HTTP +HTTP GET + + + +# +# Server-side + + +HTTP/1.1 304 Not Modified +Date: Tue, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +ETag: "21025-dc7-39462498" + + + + +# +# Client-side + + +http + + +Use --etag-compare and --etag-save on an existing file + + +"21025-dc7-39462498" + + +http://%HOSTIP:%HTTPPORT/%TESTNUMBER --etag-compare %LOGDIR/etag%TESTNUMBER --etag-save %LOGDIR/etag%TESTNUMBER + + + +# Verify that the file still exists with the correct etag value. + + +GET /%TESTNUMBER HTTP/1.1 +Host: %HOSTIP:%HTTPPORT +User-Agent: curl/%VERSION +Accept: */* +If-None-Match: "21025-dc7-39462498" + + + +"21025-dc7-39462498" + + +