[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