curl tool: don't abort glob-loop due to failures

We want to continue to the next URL to try even on failures returned
from libcurl. This makes -f with ranges still get subsequent URLs even
if occasional ones return error. This was a regression as it used to
work and broke in the 7.23.0 release.

Added test case 1328 to verify the fix.

Bug: http://curl.haxx.se/bug/view.cgi?id=3481223
Reported by: Juan Barreto
This commit is contained in:
Daniel Stenberg 2012-02-06 10:46:25 +01:00
parent 466150bc64
commit 65103efe49
3 changed files with 75 additions and 13 deletions

View File

@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
* *
* This software is licensed as described in the file COPYING, which * This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms * you should have received as part of this distribution. The terms
@ -384,7 +384,7 @@ int operate(struct Configurable *config, int argc, argv_item_t argv[])
URLGlob *inglob; URLGlob *inglob;
outfiles = NULL; outfiles = NULL;
infilenum = 0; infilenum = 1;
inglob = NULL; inglob = NULL;
/* urlnode->url is the full URL (it might be NULL) */ /* urlnode->url is the full URL (it might be NULL) */
@ -422,7 +422,7 @@ int operate(struct Configurable *config, int argc, argv_item_t argv[])
/* Here's the loop for uploading multiple files within the same /* Here's the loop for uploading multiple files within the same
single globbed string. If no upload, we enter the loop once anyway. */ single globbed string. If no upload, we enter the loop once anyway. */
for(up = 0 ;; up++) { for(up = 0 ; up < infilenum; up++) {
char *uploadfile; /* a single file, never a glob */ char *uploadfile; /* a single file, never a glob */
int separator; int separator;
@ -472,7 +472,7 @@ int operate(struct Configurable *config, int argc, argv_item_t argv[])
separator= ((!outfiles || curlx_strequal(outfiles, "-")) && urlnum > 1); separator= ((!outfiles || curlx_strequal(outfiles, "-")) && urlnum > 1);
/* Here's looping around each globbed URL */ /* Here's looping around each globbed URL */
for(i = 0 ;; i++) { for(i = 0 ; i < urlnum; i++) {
int infd; int infd;
bool infdopen; bool infdopen;
@ -1463,10 +1463,6 @@ int operate(struct Configurable *config, int argc, argv_item_t argv[])
infd = STDIN_FILENO; infd = STDIN_FILENO;
} }
/* upon error exit loop */
if(res)
break;
} /* loop to the next URL */ } /* loop to the next URL */
/* Free loop-local allocated memory */ /* Free loop-local allocated memory */
@ -1479,10 +1475,6 @@ int operate(struct Configurable *config, int argc, argv_item_t argv[])
urls = NULL; urls = NULL;
} }
/* upon error exit loop */
if(res)
break;
} /* loop to the next globbed upload file */ } /* loop to the next globbed upload file */
/* Free loop-local allocated memory */ /* Free loop-local allocated memory */

View File

@ -82,7 +82,7 @@ test1220 \
test1300 test1301 test1302 test1303 test1304 test1305 \ test1300 test1301 test1302 test1303 test1304 test1305 \
test1306 test1307 test1308 test1309 test1310 test1311 test1312 test1313 \ test1306 test1307 test1308 test1309 test1310 test1311 test1312 test1313 \
test1314 test1315 test1316 test1317 test1318 test1319 test1320 test1321 \ test1314 test1315 test1316 test1317 test1318 test1319 test1320 test1321 \
test1322 test1323 test1324 test1325 test1326 test1327 \ test1322 test1323 test1324 test1325 test1326 test1327 test1328 \
test2000 test2001 test2002 test2003 test2004 test2000 test2001 test2002 test2003 test2004
EXTRA_DIST = $(TESTCASES) DISABLED EXTRA_DIST = $(TESTCASES) DISABLED

70
tests/data/test1328 Normal file
View File

@ -0,0 +1,70 @@
<testcase>
<info>
<keywords>
HTTP
HTTP GET
-f
</keywords>
</info>
<reply>
<data>
HTTP/1.1 404 OK
Date: Thu, 09 Nov 2010 14:49:00 GMT
Content-Length: 6
Funny-head: yesyes
-noo-
</data>
<data1>
HTTP/1.1 200 OK
Date: Thu, 09 Nov 2010 14:49:00 GMT
Content-Length: 6
Connection: close
Funny-head: yesyes
-yes-
</data1>
<datacheck>
HTTP/1.1 200 OK
Date: Thu, 09 Nov 2010 14:49:00 GMT
Content-Length: 6
Connection: close
Funny-head: yesyes
-yes-
</datacheck>
</reply>
#
# Client-side
<client>
<server>
http
</server>
<name>
HTTP GET a globbed range with -f
</name>
<command>
-f 'http://%HOSTIP:%HTTPPORT/[13280000-13280001]' -o log/#1
</command>
</client>
#
# Verify data after the test has been "shot"
<verify>
<strip>
^User-Agent:.*
</strip>
<protocol>
GET /13280000 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Accept: */*
GET /13280001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Accept: */*
</protocol>
</verify>
</testcase>