diff options
author | Daniel Stenberg <daniel@haxx.se> | 2016-11-12 14:19:29 +0100 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2016-11-14 08:35:40 +0100 |
commit | f82bbe01c8835b8788c69f05362bb789766473cd (patch) | |
tree | e5c8bd5b8b10e24c350d0cfa830875f53cbc31ca | |
parent | f682156a4fc6c43fb38db4abda49b9a1bc1ed368 (diff) |
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
-rw-r--r-- | docs/curl.1 | 17 | ||||
-rw-r--r-- | src/tool_cfgable.h | 2 | ||||
-rw-r--r-- | src/tool_getparam.c | 11 | ||||
-rw-r--r-- | src/tool_operate.c | 4 | ||||
-rw-r--r-- | tests/data/Makefile.inc | 2 | ||||
-rw-r--r-- | tests/data/test1247 | 38 |
6 files changed, 68 insertions, 6 deletions
diff --git a/docs/curl.1 b/docs/curl.1 index 8434d6b7a..44bfe5b0c 100644 --- a/docs/curl.1 +++ b/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. (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 diff --git a/src/tool_cfgable.h b/src/tool_cfgable.h index 9f4dbba8c..e72fab11b 100644 --- a/src/tool_cfgable.h +++ b/src/tool_cfgable.h @@ -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 */ diff --git a/src/tool_getparam.c b/src/tool_getparam.c index d1888a2ab..1f89fbc00 100644 --- a/src/tool_getparam.c +++ b/src/tool_getparam.c @@ -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 diff --git a/src/tool_operate.c b/src/tool_operate.c index d467b0df5..c44f2141c 100644 --- a/src/tool_operate.c +++ b/src/tool_operate.c @@ -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 */ diff --git a/tests/data/Makefile.inc b/tests/data/Makefile.inc index e5a9e1fe7..a2ece3dde 100644 --- a/tests/data/Makefile.inc +++ b/tests/data/Makefile.inc @@ -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 \ diff --git a/tests/data/test1247 b/tests/data/test1247 new file mode 100644 index 000000000..48c5ccdf4 --- /dev/null +++ b/tests/data/test1247 @@ -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> |