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

curl: Add --retry-connrefused

to consider ECONNREFUSED as a transient error.

Closes #1064
This commit is contained in:
Daniel Hwang 2016-10-09 16:00:25 -07:00 committed by Daniel Stenberg
parent ea80a2dcfc
commit cdfda3ee82
5 changed files with 24 additions and 1 deletions

View File

@ -1620,6 +1620,10 @@ also \fI--retry-max-time\fP to limit the total time allowed for
retries. (Added in 7.12.3) retries. (Added in 7.12.3)
If this option is used several times, the last one will be used. If this option is used several times, the last one will be used.
.IP "--retry-connrefused"
In addition to the other conditions, consider ECONNREFUSED as a transient
error too for \fI--retry\fP. This option is used together with
\fI--retry\fP. (Added in 7.52.0)
.IP "--retry-delay <seconds>" .IP "--retry-delay <seconds>"
Make curl sleep this amount of time before each retry when a transfer has Make curl sleep this amount of time before each retry when a transfer has
failed with a transient error (it changes the default backoff time algorithm failed with a transient error (it changes the default backoff time algorithm

View File

@ -176,6 +176,7 @@ struct OperationConfig {
bool tcp_nodelay; bool tcp_nodelay;
bool tcp_fastopen; bool tcp_fastopen;
long req_retry; /* number of retries */ long req_retry; /* number of retries */
bool retry_connrefused; /* set connection refused as a transient error */
long retry_delay; /* delay between retries (in seconds) */ long retry_delay; /* delay between retries (in seconds) */
long retry_maxtime; /* maximum time to keep retrying */ long retry_maxtime; /* maximum time to keep retrying */

View File

@ -125,6 +125,7 @@ static const struct LongShort aliases[]= {
{"$e", "proxy-digest", FALSE}, {"$e", "proxy-digest", FALSE},
{"$f", "proxy-basic", FALSE}, {"$f", "proxy-basic", FALSE},
{"$g", "retry", TRUE}, {"$g", "retry", TRUE},
{"$V", "retry-connrefused", FALSE},
{"$h", "retry-delay", TRUE}, {"$h", "retry-delay", TRUE},
{"$i", "retry-max-time", TRUE}, {"$i", "retry-max-time", TRUE},
{"$k", "proxy-negotiate", FALSE}, {"$k", "proxy-negotiate", FALSE},
@ -793,6 +794,9 @@ ParameterError getparameter(char *flag, /* f or -long-flag */
if(err) if(err)
return err; return err;
break; break;
case 'V': /* --retry-connrefused */
config->retry_connrefused = toggle;
break;
case 'h': /* --retry-delay */ case 'h': /* --retry-delay */
err = str2unum(&config->retry_delay, nextarg); err = str2unum(&config->retry_delay, nextarg);
if(err) if(err)

View File

@ -198,6 +198,8 @@ static const char *const helptext[] = {
" --resolve HOST:PORT:ADDRESS Force resolve of HOST:PORT to ADDRESS", " --resolve HOST:PORT:ADDRESS Force resolve of HOST:PORT to ADDRESS",
" --retry NUM " " --retry NUM "
"Retry request NUM times if transient problems occur", "Retry request NUM times if transient problems occur",
" --retry-connrefused "
"Consider \"connection refused\" a transient error",
" --retry-delay SECONDS Wait SECONDS between retries", " --retry-delay SECONDS Wait SECONDS between retries",
" --retry-max-time SECONDS Retry only within this period", " --retry-max-time SECONDS Retry only within this period",
" --sasl-ir Enable initial response in SASL authentication", " --sasl-ir Enable initial response in SASL authentication",

View File

@ -1441,6 +1441,7 @@ static CURLcode operate_do(struct GlobalConfig *global,
enum { enum {
RETRY_NO, RETRY_NO,
RETRY_TIMEOUT, RETRY_TIMEOUT,
RETRY_CONNREFUSED,
RETRY_HTTP, RETRY_HTTP,
RETRY_FTP, RETRY_FTP,
RETRY_LAST /* not used */ RETRY_LAST /* not used */
@ -1452,6 +1453,13 @@ static CURLcode operate_do(struct GlobalConfig *global,
(CURLE_FTP_ACCEPT_TIMEOUT == result)) (CURLE_FTP_ACCEPT_TIMEOUT == result))
/* retry timeout always */ /* retry timeout always */
retry = RETRY_TIMEOUT; retry = RETRY_TIMEOUT;
else if(config->retry_connrefused &&
(CURLE_COULDNT_CONNECT == result)) {
long oserrno;
curl_easy_getinfo(curl, CURLINFO_OS_ERRNO, &oserrno);
if(ECONNREFUSED == oserrno)
retry = RETRY_CONNREFUSED;
}
else if((CURLE_OK == result) || else if((CURLE_OK == result) ||
(config->failonerror && (config->failonerror &&
(CURLE_HTTP_RETURNED_ERROR == result))) { (CURLE_HTTP_RETURNED_ERROR == result))) {
@ -1499,7 +1507,11 @@ static CURLcode operate_do(struct GlobalConfig *global,
if(retry) { if(retry) {
static const char * const m[]={ static const char * const m[]={
NULL, "timeout", "HTTP error", "FTP error" NULL,
"timeout",
"connection refused",
"HTTP error",
"FTP error"
}; };
warnf(config->global, "Transient problem: %s " warnf(config->global, "Transient problem: %s "