aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2011-11-20 23:33:46 +0100
committerDaniel Stenberg <daniel@haxx.se>2011-11-20 23:35:49 +0100
commitc532604b137cae2e2814280778f914e4cd0460d1 (patch)
treed3104e465a15e8e5b813906129f4010b4921d694
parent64f328c787ab763cc994eadd6b82f32490d37ebb (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.c3
-rw-r--r--src/tool_operate.c59
-rw-r--r--src/tool_operhlp.c18
-rw-r--r--tests/data/Makefile.am2
-rw-r--r--tests/data/test121063
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>