diff options
author | Daniel Stenberg <daniel@haxx.se> | 2011-11-20 23:33:46 +0100 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2011-11-20 23:35:49 +0100 |
commit | c532604b137cae2e2814280778f914e4cd0460d1 (patch) | |
tree | d3104e465a15e8e5b813906129f4010b4921d694 | |
parent | 64f328c787ab763cc994eadd6b82f32490d37ebb (diff) |
-J -O: use -O name if no Content-Disposition header comes!
A regression between 7.22.0 and 7.23.0 -- downloading a file with the
flags -O and -J results in the content being written to stdout if and
only if there was no Content-Disposition header in the http response. If
there is a C-D header with a filename attribute, the output is correctly
written.
Reported by: Dave Reisner
Bug: http://curl.haxx.se/mail/archive-2011-11/0030.html
-rw-r--r-- | src/tool_cb_hdr.c | 3 | ||||
-rw-r--r-- | src/tool_operate.c | 59 | ||||
-rw-r--r-- | src/tool_operhlp.c | 18 | ||||
-rw-r--r-- | tests/data/Makefile.am | 2 | ||||
-rw-r--r-- | tests/data/test1210 | 63 |
5 files changed, 112 insertions, 33 deletions
diff --git a/src/tool_cb_hdr.c b/src/tool_cb_hdr.c index fb24b4508..dea73387a 100644 --- a/src/tool_cb_hdr.c +++ b/src/tool_cb_hdr.c @@ -66,8 +66,7 @@ size_t tool_header_cb(void *ptr, size_t size, size_t nmemb, void *userdata) } #endif - if(!outs->filename && (cb > 20) && - checkprefix("Content-disposition:", str)) { + if((cb > 20) && checkprefix("Content-disposition:", str)) { const char *p = str + 20; /* look for the 'filename=' parameter diff --git a/src/tool_operate.c b/src/tool_operate.c index 7ab815f83..1e881207f 100644 --- a/src/tool_operate.c +++ b/src/tool_operate.c @@ -576,41 +576,40 @@ int operate(struct Configurable *config, int argc, argv_item_t argv[]) if((urlnode->flags & GETOUT_USEREMOTE) && config->content_disposition) { - /* Our header callback sets the filename */ + /* Our header callback MIGHT set the filename */ DEBUGASSERT(!outs.filename); } - else { - if(config->resume_from_current) { - /* We're told to continue from where we are now. Get the size - of the file as it is now and open it for append instead */ - struct_stat fileinfo; - /* VMS -- Danger, the filesize is only valid for stream files */ - if(0 == stat(outfile, &fileinfo)) - /* set offset to current file size: */ - config->resume_from = fileinfo.st_size; - else - /* let offset be 0 */ - config->resume_from = 0; - } - if(config->resume_from) { - /* open file for output: */ - FILE *file = fopen(outfile, config->resume_from?"ab":"wb"); - if(!file) { - helpf(config->errors, "Can't open '%s'!\n", outfile); - res = CURLE_WRITE_ERROR; - goto quit_urls; - } - outs.fopened = TRUE; - outs.stream = file; - outs.init = config->resume_from; - } - else { - outs.stream = NULL; /* open when needed */ + if(config->resume_from_current) { + /* We're told to continue from where we are now. Get the size + of the file as it is now and open it for append instead */ + struct_stat fileinfo; + /* VMS -- Danger, the filesize is only valid for stream files */ + if(0 == stat(outfile, &fileinfo)) + /* set offset to current file size: */ + config->resume_from = fileinfo.st_size; + else + /* let offset be 0 */ + config->resume_from = 0; + } + + if(config->resume_from) { + /* open file for output: */ + FILE *file = fopen(outfile, config->resume_from?"ab":"wb"); + if(!file) { + helpf(config->errors, "Can't open '%s'!\n", outfile); + res = CURLE_WRITE_ERROR; + goto quit_urls; } - outs.filename = outfile; - outs.s_isreg = TRUE; + outs.fopened = TRUE; + outs.stream = file; + outs.init = config->resume_from; + } + else { + outs.stream = NULL; /* open when needed */ } + outs.filename = outfile; + outs.s_isreg = TRUE; } if(uploadfile && !stdin_upload(uploadfile)) { diff --git a/src/tool_operhlp.c b/src/tool_operhlp.c index 808d2d564..4c1697b20 100644 --- a/src/tool_operhlp.c +++ b/src/tool_operhlp.c @@ -178,6 +178,24 @@ CURLcode get_url_file_name(char **filename, const char *url) return CURLE_OUT_OF_MEMORY; } } + + /* in case we built debug enabled, we allow an environment variable + * named CURL_TESTDIR to prefix the given file name to put it into a + * specific directory + */ +#ifdef DEBUGBUILD + { + char *tdir = curlx_getenv("CURL_TESTDIR"); + if(tdir) { + char buffer[512]; /* suitably large */ + snprintf(buffer, sizeof(buffer), "%s/%s", tdir, *filename); + Curl_safefree(*filename); + *filename = strdup(buffer); /* clone the buffer */ + curl_free(tdir); + } + } +#endif + return CURLE_OK; } diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am index 581d46b86..c52ef243c 100644 --- a/tests/data/Makefile.am +++ b/tests/data/Makefile.am @@ -77,7 +77,7 @@ test1110 test1111 test1112 test1113 test1114 test1115 test1116 test1117 \ test1118 test1119 test1120 test1121 test1122 test1123 test1124 test1125 \ test1126 test1127 test1128 test1129 test1130 test1131 \ test1200 test1201 test1202 test1203 test1204 test1205 test1206 test1207 \ -test1208 test1209 \ +test1208 test1209 test1210 \ test1300 test1301 test1302 test1303 test1304 test1305 \ test1306 test1307 test1308 test1309 test1310 test1311 test1312 test1313 \ test1314 \ diff --git a/tests/data/test1210 b/tests/data/test1210 new file mode 100644 index 000000000..df931988c --- /dev/null +++ b/tests/data/test1210 @@ -0,0 +1,63 @@ +<testcase> +<info> +<keywords> +HTTP +HTTP GET +-J +</keywords> +</info> + +# +<reply> +<data nocheck="yes"> +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 6 +Connection: close +Content-Type: text/html + +12345 +</data> +</reply> + +# +# Client-side +<client> +# this relies on the debug feature to allow us to set directory to store the +# -O output in, using the CURL_TESTDIR variable +<features> +debug +</features> +<server> +http +</server> +<name> +HTTP GET with -J without Content-Disposition +</name> +<setenv> +CURL_TESTDIR=%PWD/log +</setenv> +<command option="no-output,no-include"> +http://%HOSTIP:%HTTPPORT/1210 -J -O +</command> +</client> + +# +# Verify data after the test has been "shot" +<verify> +<strip> +^User-Agent:.* +</strip> +<protocol> +GET /1210 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+
+</protocol> +<file name="log/1210"> +12345 +</file> + +</verify> +</testcase> |