]> granicus.if.org Git - curl/commitdiff
curl: add --fail-early
authorDaniel Stenberg <daniel@haxx.se>
Sat, 12 Nov 2016 13:19:29 +0000 (14:19 +0100)
committerDaniel Stenberg <daniel@haxx.se>
Mon, 14 Nov 2016 07:35:40 +0000 (08:35 +0100)
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

docs/curl.1
src/tool_cfgable.h
src/tool_getparam.c
src/tool_operate.c
tests/data/Makefile.inc
tests/data/test1247 [new file with mode: 0644]

index 8434d6b7a239e456e746720c8087900a458d1acd..44bfe5b0cb7cb658f276c93c35d81274b9b2019d 100644 (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
index 9f4dbba8c2569cb7d67cb299a235738dfa5f5acd..e72fab11b31fd47217312be051ee7a461e6ab084 100644 (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 */
index d1888a2aba7db7c3b9d7b3e656884d4edfaf94ff..1f89fbc00ea3df17a5c7de8b0b7e246c12d7dbcd 100644 (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
index d467b0df50ddb076668d8ab8d35ffe01477b41d1..c44f2141c7285fcf21444557568a7e421a194fd9 100644 (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 */
index e5a9e1fe7c1d3666f655bc960e7b77fb9044c955..a2ece3dde7a4f6674c62b7ddb6d1972b4241de37 100644 (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 \
diff --git a/tests/data/test1247 b/tests/data/test1247
new file mode 100644 (file)
index 0000000..48c5ccd
--- /dev/null
@@ -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>