From b995bb58cbd976280b132ee2148376fadd071063 Mon Sep 17 00:00:00 2001 From: Jay Satiro Date: Sat, 4 Apr 2020 16:16:18 -0400 Subject: tool: Add option --retry-all-errors to retry on any error The "sledgehammer" of retrying. Closes https://github.com/curl/curl/pull/5185 --- src/tool_cfgable.h | 1 + src/tool_getparam.c | 4 ++++ src/tool_help.c | 2 ++ src/tool_operate.c | 5 +++++ 4 files changed, 12 insertions(+) (limited to 'src') diff --git a/src/tool_cfgable.h b/src/tool_cfgable.h index d7eebf598..c5b8c3071 100644 --- a/src/tool_cfgable.h +++ b/src/tool_cfgable.h @@ -223,6 +223,7 @@ struct OperationConfig { bool tcp_nodelay; bool tcp_fastopen; long req_retry; /* number of retries */ + bool retry_all_errors; /* retry on any error */ bool retry_connrefused; /* set connection refused as a transient error */ long retry_delay; /* delay between retries (in seconds) */ long retry_maxtime; /* maximum time to keep retrying */ diff --git a/src/tool_getparam.c b/src/tool_getparam.c index 0252ee029..c0ab67c3f 100644 --- a/src/tool_getparam.c +++ b/src/tool_getparam.c @@ -197,6 +197,7 @@ static const struct LongShort aliases[]= { {"$Y", "suppress-connect-headers", ARG_BOOL}, {"$Z", "compressed-ssh", ARG_BOOL}, {"$~", "happy-eyeballs-timeout-ms", ARG_STRING}, + {"$!", "retry-all-errors", ARG_BOOL}, {"0", "http1.0", ARG_NONE}, {"01", "http1.1", ARG_NONE}, {"02", "http2", ARG_NONE}, @@ -927,6 +928,9 @@ ParameterError getparameter(const char *flag, /* f or -long-flag */ if(err) return err; break; + case '!': /* --retry-all-errors */ + config->retry_all_errors = toggle; + break; case 'k': /* --proxy-negotiate */ if(curlinfo->features & CURL_VERSION_SPNEGO) diff --git a/src/tool_help.c b/src/tool_help.c index 5afaf822e..92ccae3b9 100644 --- a/src/tool_help.c +++ b/src/tool_help.c @@ -399,6 +399,8 @@ static const struct helptxt helptext[] = { "Retry on connection refused (use with --retry)"}, {" --retry-delay ", "Wait time between retries"}, + {" --retry-all-errors", + "Retry all errors (use with --retry) (read manpage, don't use by default)"}, {" --retry-max-time ", "Retry only within this period"}, {" --sasl-authzid ", diff --git a/src/tool_operate.c b/src/tool_operate.c index 66c6468bc..6d489aa30 100644 --- a/src/tool_operate.c +++ b/src/tool_operate.c @@ -437,6 +437,7 @@ static CURLcode post_per_transfer(struct GlobalConfig *global, config->retry_maxtime*1000L)) ) { enum { RETRY_NO, + RETRY_ALL_ERRORS, RETRY_TIMEOUT, RETRY_CONNREFUSED, RETRY_HTTP, @@ -506,11 +507,15 @@ static CURLcode post_per_transfer(struct GlobalConfig *global, retry = RETRY_FTP; } + if(result && !retry && config->retry_all_errors) + retry = RETRY_ALL_ERRORS; + if(retry) { long sleeptime = 0; curl_off_t retry_after = 0; static const char * const m[]={ NULL, + "(retrying all errors)", "timeout", "connection refused", "HTTP error", -- cgit v1.2.3