1
0
mirror of https://github.com/moparisthebest/curl synced 2024-12-21 23:58:49 -05:00

curl: add --fail-early

Exit with an error on the first transfer error instead of continuing to
do the rest of the URLs.

Discussion: https://curl.haxx.se/mail/archive-2016-11/0038.html
This commit is contained in:
Daniel Stenberg 2016-11-12 14:19:29 +01:00
parent f682156a4f
commit f82bbe01c8
6 changed files with 68 additions and 6 deletions

View File

@ -620,6 +620,23 @@ or no response at all is received, the verification fails.
This is currently only implemented in the OpenSSL, GnuTLS and NSS backends.
(Added in 7.41.0)
.IP "--fail-early"
Fail and exit on first detected error.
When curl is used to do multiple transfers on the command line, it will
attempt to operate on each given URL, one by one. By default, it will ignore
errors if there are more URLs given and the last URL's success will determine
the error code curl returns. So early failures will be "hidden" by subsequent
successful transfers.
Using this option, curl will instead return an error on the first transfers
that fails, independent on the amount of more URLs that are given on the
command line. This way, no transfer failures go undetected by scripts and
similar.
This option will apply for all given URLs even if you use \fI--next\fP.
(Added in 7.52.0)
.IP "--false-start"
(SSL) Tells curl to use false start during the TLS handshake. False start is a

View File

@ -239,7 +239,7 @@ struct GlobalConfig {
bool tracetime; /* include timestamp? */
int progressmode; /* CURL_PROGRESS_BAR / CURL_PROGRESS_STATS */
char *libcurl; /* Output libcurl code to this file name */
bool fail_early; /* exit on first transfer error */
struct OperationConfig *first;
struct OperationConfig *current;
struct OperationConfig *last; /* Always last in the struct */

View File

@ -231,6 +231,7 @@ static const struct LongShort aliases[]= {
{"Es", "ssl-no-revoke", FALSE},
{"Et", "tcp-fastopen", FALSE},
{"f", "fail", FALSE},
{"fa", "fail-early", FALSE},
{"F", "form", TRUE},
{"Fs", "form-string", TRUE},
{"g", "globoff", FALSE},
@ -1438,8 +1439,14 @@ ParameterError getparameter(char *flag, /* f or -long-flag */
}
break;
case 'f':
/* fail hard on errors */
config->failonerror = toggle;
switch(subletter) {
case 'a': /* --fail-early */
global->fail_early = toggle;
break;
default:
/* fail hard on errors */
config->failonerror = toggle;
}
break;
case 'F':
/* "form data" simulation, this is a little advanced so lets do our best

View File

@ -1805,9 +1805,9 @@ static CURLcode operate_do(struct GlobalConfig *global,
urlnode->flags = 0;
/*
** Bail out upon critical errors
** Bail out upon critical errors or --fail-early
*/
if(is_fatal_error(result))
if(is_fatal_error(result) || (result && global->fail_early))
goto quit_curl;
} /* for-loop through all URLs */

View File

@ -127,7 +127,7 @@ test1216 test1217 test1218 test1219 \
test1220 test1221 test1222 test1223 test1224 test1225 test1226 test1227 \
test1228 test1229 test1230 test1231 test1232 test1233 test1234 test1235 \
test1236 test1237 test1238 test1239 test1240 test1241 test1242 test1243 \
test1244 test1245 test1246 \
test1244 test1245 test1246 test1247 \
\
test1300 test1301 test1302 test1303 test1304 test1305 test1306 test1307 \
test1308 test1309 test1310 test1311 test1312 test1313 test1314 test1315 \

38
tests/data/test1247 Normal file
View File

@ -0,0 +1,38 @@
<testcase>
<info>
<keywords>
HTTP
--fail-early
</keywords>
</info>
#
# Server-side
<reply>
<data>
</data>
</reply>
#
# Client-side
<client>
<server>
none
</server>
<name>
--fail-early
</name>
<command>
--fail-early h1234://%HOSTIP:%HTTPPORT/1247 http://%HOSTIP:%HTTPPORT/1247
</command>
</client>
#
# Verify data after the test has been "shot"
<verify>
# Protocol "h1234" not supported or disabled in libcurl
<errorcode>
1
</errorcode>
</verify>
</testcase>