summaryrefslogtreecommitdiff
path: root/core/curl/fix-J-with-O-regression.patch
blob: 4b7de1a2347674d8ed9c89288f3af9afcf18ff93 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
From c532604b137cae2e2814280778f914e4cd0460d1 Mon Sep 17 00:00:00 2001
From: Daniel Stenberg <daniel@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
---
 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;
 }
 
-- 
1.7.7.3