tool: determine the correct fopen option for -D

This commit fixes a bug in the dump-header feature regarding the
determination of the second fopen(3) option.

Reported-by: u20221022 on github

See #4753
See #4762
Fixes #10074
Closes #10079
This commit is contained in:
Emil Engler 2022-12-11 18:08:17 +01:00 committed by Daniel Stenberg
parent 1a88b6b653
commit 8b1e5df73d
No known key found for this signature in database
GPG Key ID: 5CC908FDB71E12C2
4 changed files with 98 additions and 2 deletions

View File

@ -969,7 +969,21 @@ static CURLcode single_transfer(struct GlobalConfig *global,
/* open file for output: */ /* open file for output: */
if(strcmp(config->headerfile, "-")) { if(strcmp(config->headerfile, "-")) {
FILE *newfile; FILE *newfile;
newfile = fopen(config->headerfile, per->prev == NULL?"wb":"ab");
/*
* this checks if the previous transfer had the same
* OperationConfig, which would mean, that the an output file has
* already been created and data can be appened to it, instead
* of overwriting it.
* TODO: Consider placing the file handle inside the
* OperationConfig, so that it does not need to be opened/closed
* for every transfer.
*/
if(per->prev && per->prev->config == config)
newfile = fopen(config->headerfile, "ab+");
else
newfile = fopen(config->headerfile, "wb+");
if(!newfile) { if(!newfile) {
warnf(global, "Failed to open %s\n", config->headerfile); warnf(global, "Failed to open %s\n", config->headerfile);
result = CURLE_WRITE_ERROR; result = CURLE_WRITE_ERROR;

View File

@ -248,7 +248,7 @@ test2500 \
test3000 test3001 test3002 test3003 test3004 test3005 test3006 test3007 \ test3000 test3001 test3002 test3003 test3004 test3005 test3006 test3007 \
test3008 test3009 test3010 test3011 test3012 test3013 test3014 test3015 \ test3008 test3009 test3010 test3011 test3012 test3013 test3014 test3015 \
test3016 test3017 test3018 test3019 test3020 test3021 test3022 test3023 \ test3016 test3017 test3018 test3019 test3020 test3021 test3022 test3023 \
test3024 test3025 test3026 test3027 test3028 \ test3024 test3025 test3026 test3027 test3028 test3029 test3030 \
\ \
test3100 test3101 \ test3100 test3101 \
test3200 test3200

39
tests/data/test3029 Normal file
View File

@ -0,0 +1,39 @@
<testcase>
<info>
<keywords>
HTTP
</keywords>
</info>
<reply>
<data>
HTTP/1.1 200 OK
Date: Tue, 09 Nov 2010 14:49:00 GMT
Content-Length: 6
-foo-
</data>
</reply>
<client>
<server>
http
</server>
<name>
HTTP with multiple -D
</name>
<command>
-D log/heads%TESTNUMBER http://%HOSTIP:%HTTPPORT/%TESTNUMBER http://%HOSTIP:%HTTPPORT/%TESTNUMBER --next -D log/heads%TESTNUMBER http://%HOSTIP:%HTTPPORT/%TESTNUMBER
</command>
</client>
<verify>
<file name="log/heads%TESTNUMBER">
HTTP/1.1 200 OK
Date: Tue, 09 Nov 2010 14:49:00 GMT
Content-Length: 6
</file>
</verify>
</testcase>

43
tests/data/test3030 Normal file
View File

@ -0,0 +1,43 @@
<testcase>
<info>
<keywords>
HTTP
</keywords>
</info>
<reply>
<data>
HTTP/1.1 200 OK
Date: Tue, 09 Nov 2010 14:49:00 GMT
Content-Length: 6
-foo-
</data>
</reply>
<client>
<server>
http
</server>
<name>
HTTP with multiple transfers in one -D
</name>
<command>
-D log/heads%TESTNUMBER http://%HOSTIP:%HTTPPORT/%TESTNUMBER http://%HOSTIP:%HTTPPORT/%TESTNUMBER
</command>
</client>
<verify>
<file name="log/heads%TESTNUMBER">
HTTP/1.1 200 OK
Date: Tue, 09 Nov 2010 14:49:00 GMT
Content-Length: 6
HTTP/1.1 200 OK
Date: Tue, 09 Nov 2010 14:49:00 GMT
Content-Length: 6
</file>
</verify>
</testcase>