[curl] curl -JO now uses -O name if no C-D header comes
Kamil Dudka
kdudka at fedoraproject.org
Mon Nov 21 17:05:35 UTC 2011
commit 09f474b4c20ac8d35b5e9f1865dce47ad0188562
Author: Kamil Dudka <kdudka at redhat.com>
Date: Mon Nov 21 17:59:27 2011 +0100
curl -JO now uses -O name if no C-D header comes
upstream commit c532604
0001-curl-7.23.0-c532604.patch | 227 ++++++++++++++++++++++++++++++++++++++++
curl.spec | 11 ++-
2 files changed, 237 insertions(+), 1 deletions(-)
---
diff --git a/0001-curl-7.23.0-c532604.patch b/0001-curl-7.23.0-c532604.patch
new file mode 100644
index 0000000..1b37290
--- /dev/null
+++ b/0001-curl-7.23.0-c532604.patch
@@ -0,0 +1,227 @@
+From c532604b137cae2e2814280778f914e4cd0460d1 Mon Sep 17 00:00:00 2001
+From: Daniel Stenberg <daniel at haxx.se>
+Date: Sun, 20 Nov 2011 23:33:46 +0100
+Subject: [PATCH] -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
+
+Signed-off-by: Kamil Dudka <kdudka at redhat.com>
+---
+ src/tool_cb_hdr.c | 3 +-
+ src/tool_operate.c | 59 ++++++++++++++++++++++----------------------
+ src/tool_operhlp.c | 18 +++++++++++++
+ tests/data/Makefile.am | 2 +-
+ tests/data/test1210 | 63 ++++++++++++++++++++++++++++++++++++++++++++++++
+ 5 files changed, 112 insertions(+), 33 deletions(-)
+ create mode 100644 tests/data/test1210
+
+diff --git a/src/tool_cb_hdr.c b/src/tool_cb_hdr.c
+index fb24b45..dea7338 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 7ab815f..1e88120 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 808d2d5..4c1697b 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 581d46b..c52ef24 100644
+--- a/tests/data/Makefile.am
++++ b/tests/data/Makefile.am
+@@ -76,7 +76,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 0000000..df93198
+--- /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>
+--
+1.7.1
+
diff --git a/curl.spec b/curl.spec
index b48bc5a..0c28a4f 100644
--- a/curl.spec
+++ b/curl.spec
@@ -1,13 +1,16 @@
Summary: A utility for getting files from remote servers (FTP, HTTP, and others)
Name: curl
Version: 7.23.0
-Release: 1%{?dist}
+Release: 2%{?dist}
License: MIT
Group: Applications/Internet
Source: http://curl.haxx.se/download/%{name}-%{version}.tar.lzma
Source2: curlbuild.h
Source3: hide_selinux.c
+# -J -O: use -O name if no Content-Disposition header comes!
+Patch1: 0001-curl-7.23.0-c532604.patch
+
# patch making libcurl multilib ready
Patch101: 0101-curl-7.21.1-multilib.patch
@@ -106,6 +109,9 @@ for f in CHANGES README; do
mv -f ${f}.utf8 ${f}
done
+# upstream patches
+%patch1 -p1
+
# Fedora patches
%patch101 -p1
%patch102 -p1
@@ -218,6 +224,9 @@ rm -rf $RPM_BUILD_ROOT
%{_datadir}/aclocal/libcurl.m4
%changelog
+* Mon Nov 21 2011 Kamil Dudka <kdudka at redhat.com> 7.23.0-2
+- curl -JO now uses -O name if no C-D header comes (upstream commit c532604)
+
* Wed Nov 16 2011 Kamil Dudka <kdudka at redhat.com> 7.23.0-1
- new upstream release (#754391)
More information about the scm-commits
mailing list