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:
parent
f682156a4f
commit
f82bbe01c8
17
docs/curl.1
17
docs/curl.1
@ -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.
|
This is currently only implemented in the OpenSSL, GnuTLS and NSS backends.
|
||||||
(Added in 7.41.0)
|
(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"
|
.IP "--false-start"
|
||||||
|
|
||||||
(SSL) Tells curl to use false start during the TLS handshake. False start is a
|
(SSL) Tells curl to use false start during the TLS handshake. False start is a
|
||||||
|
|||||||
@ -239,7 +239,7 @@ struct GlobalConfig {
|
|||||||
bool tracetime; /* include timestamp? */
|
bool tracetime; /* include timestamp? */
|
||||||
int progressmode; /* CURL_PROGRESS_BAR / CURL_PROGRESS_STATS */
|
int progressmode; /* CURL_PROGRESS_BAR / CURL_PROGRESS_STATS */
|
||||||
char *libcurl; /* Output libcurl code to this file name */
|
char *libcurl; /* Output libcurl code to this file name */
|
||||||
|
bool fail_early; /* exit on first transfer error */
|
||||||
struct OperationConfig *first;
|
struct OperationConfig *first;
|
||||||
struct OperationConfig *current;
|
struct OperationConfig *current;
|
||||||
struct OperationConfig *last; /* Always last in the struct */
|
struct OperationConfig *last; /* Always last in the struct */
|
||||||
|
|||||||
@ -231,6 +231,7 @@ static const struct LongShort aliases[]= {
|
|||||||
{"Es", "ssl-no-revoke", FALSE},
|
{"Es", "ssl-no-revoke", FALSE},
|
||||||
{"Et", "tcp-fastopen", FALSE},
|
{"Et", "tcp-fastopen", FALSE},
|
||||||
{"f", "fail", FALSE},
|
{"f", "fail", FALSE},
|
||||||
|
{"fa", "fail-early", FALSE},
|
||||||
{"F", "form", TRUE},
|
{"F", "form", TRUE},
|
||||||
{"Fs", "form-string", TRUE},
|
{"Fs", "form-string", TRUE},
|
||||||
{"g", "globoff", FALSE},
|
{"g", "globoff", FALSE},
|
||||||
@ -1438,8 +1439,14 @@ ParameterError getparameter(char *flag, /* f or -long-flag */
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'f':
|
case 'f':
|
||||||
/* fail hard on errors */
|
switch(subletter) {
|
||||||
config->failonerror = toggle;
|
case 'a': /* --fail-early */
|
||||||
|
global->fail_early = toggle;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
/* fail hard on errors */
|
||||||
|
config->failonerror = toggle;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 'F':
|
case 'F':
|
||||||
/* "form data" simulation, this is a little advanced so lets do our best
|
/* "form data" simulation, this is a little advanced so lets do our best
|
||||||
|
|||||||
@ -1805,9 +1805,9 @@ static CURLcode operate_do(struct GlobalConfig *global,
|
|||||||
urlnode->flags = 0;
|
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;
|
goto quit_curl;
|
||||||
|
|
||||||
} /* for-loop through all URLs */
|
} /* for-loop through all URLs */
|
||||||
|
|||||||
@ -127,7 +127,7 @@ test1216 test1217 test1218 test1219 \
|
|||||||
test1220 test1221 test1222 test1223 test1224 test1225 test1226 test1227 \
|
test1220 test1221 test1222 test1223 test1224 test1225 test1226 test1227 \
|
||||||
test1228 test1229 test1230 test1231 test1232 test1233 test1234 test1235 \
|
test1228 test1229 test1230 test1231 test1232 test1233 test1234 test1235 \
|
||||||
test1236 test1237 test1238 test1239 test1240 test1241 test1242 test1243 \
|
test1236 test1237 test1238 test1239 test1240 test1241 test1242 test1243 \
|
||||||
test1244 test1245 test1246 \
|
test1244 test1245 test1246 test1247 \
|
||||||
\
|
\
|
||||||
test1300 test1301 test1302 test1303 test1304 test1305 test1306 test1307 \
|
test1300 test1301 test1302 test1303 test1304 test1305 test1306 test1307 \
|
||||||
test1308 test1309 test1310 test1311 test1312 test1313 test1314 test1315 \
|
test1308 test1309 test1310 test1311 test1312 test1313 test1314 test1315 \
|
||||||
|
|||||||
38
tests/data/test1247
Normal file
38
tests/data/test1247
Normal 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>
|
||||||
Loading…
Reference in New Issue
Block a user