diff options
author | Daniel Stenberg <daniel@haxx.se> | 2019-08-06 11:57:02 +0200 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2019-08-07 14:45:44 +0200 |
commit | 640b9733de74d629af68afcad0ff8bb658e80eff (patch) | |
tree | 2a6b8f44a26baf7829246658f11489422cee615a | |
parent | d39ae9d493f5e3abc1241d6e7ff89a885be1387a (diff) |
curl: make use of CURLINFO_RETRY_AFTER when retrying
If a Retry-After: header was used in the response, that value overrides
other retry timing options.
Fixes #3794
Closes #4195
-rw-r--r-- | docs/cmdline-opts/retry.d | 3 | ||||
-rw-r--r-- | src/tool_operate.c | 15 |
2 files changed, 17 insertions, 1 deletions
diff --git a/docs/cmdline-opts/retry.d b/docs/cmdline-opts/retry.d index 32d1c799b..3db89b71c 100644 --- a/docs/cmdline-opts/retry.d +++ b/docs/cmdline-opts/retry.d @@ -14,4 +14,7 @@ for all forthcoming retries it will double the waiting time until it reaches using --retry-delay you disable this exponential backoff algorithm. See also --retry-max-time to limit the total time allowed for retries. +Since curl 7.66.0, curl will comply with the Retry-After: response header if +one was present to know when to issue the next retry. + If this option is used several times, the last one will be used. diff --git a/src/tool_operate.c b/src/tool_operate.c index 923b5a99d..01ee20061 100644 --- a/src/tool_operate.c +++ b/src/tool_operate.c @@ -496,6 +496,8 @@ static CURLcode post_transfer(struct GlobalConfig *global, } if(retry) { + long sleeptime = 0; + curl_off_t retry_after = 0; static const char * const m[]={ NULL, "timeout", @@ -504,13 +506,24 @@ static CURLcode post_transfer(struct GlobalConfig *global, "FTP error" }; + sleeptime = per->retry_sleep; + if(RETRY_HTTP == retry) { + curl_easy_getinfo(curl, CURLINFO_RETRY_AFTER, &retry_after); + if(retry_after) { + /* store in a 'long', make sure it doesn't overflow */ + if(retry_after > LONG_MAX/1000) + sleeptime = LONG_MAX; + else + sleeptime = (long)retry_after * 1000; /* milliseconds */ + } + } warnf(config->global, "Transient problem: %s " "Will retry in %ld seconds. " "%ld retries left.\n", m[retry], per->retry_sleep/1000L, per->retry_numretries); - tool_go_sleep(per->retry_sleep); per->retry_numretries--; + tool_go_sleep(sleeptime); if(!config->retry_delay) { per->retry_sleep *= 2; if(per->retry_sleep > RETRY_SLEEP_MAX) |