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

more retry stuff

This commit is contained in:
Daniel Stenberg 2004-11-04 16:17:23 +00:00
parent 1887629c5c
commit fd884a3cd2
3 changed files with 41 additions and 13 deletions

View File

@ -6,7 +6,14 @@
Changelog Changelog
Daniel (4 November 2004)
- Andres Garcia made it build on mingw againa, my --retry code broke the build.
Daniel (2 November 2004) Daniel (2 November 2004)
- Added --retry-max-time that allows a maximum time that may not have been
reached for a retry to be made. If not set there is no maximum time, only
the amount of retries set with --retry.
- Paul Nolan provided a patch to make libcurl build nicely on Windows CE. - Paul Nolan provided a patch to make libcurl build nicely on Windows CE.
Daniel (1 November 2004) Daniel (1 November 2004)

View File

@ -726,26 +726,32 @@ If this option is used twice, the second time disables this again.
.IP "--retry <num>" .IP "--retry <num>"
If a transient error is returned when curl tries to perform a transfer, it If a transient error is returned when curl tries to perform a transfer, it
will retry this number of times before giving up. Setting the number to 0 will retry this number of times before giving up. Setting the number to 0
makes curl do no retries (which is the default). makes curl do no retries (which is the default). Transient error means either:
a timeout, an FTP 5xx response code or an HTTP 5xx response code.
Transient error means either: timeout, an FTP 5xx response code or a HTTP 5xx
response code.
When curl is about to retry a transfer, it will first wait one second and then When curl is about to retry a transfer, it will first wait one second and then
for all forthcoming retries it will double the waiting time until it reaches for all forthcoming retries it will double the waiting time until it reaches
10 minutes which then will be the delay between the rest of the retries. 10 minutes which then will be the delay between the rest of the retries. By
using \fI--retry-delay\fP you disable this exponential backoff algorithm. See
By using \fI--retry-delay\fP you disable this exponential backoff algorithm. also \fI--retry-max-time\fP to limit the total time allowed for
(Option added in 7.12.3) retries. (Option added in 7.12.3)
If this option is used multiple times, the last occurance decide the amount. If this option is used multiple times, the last occurance decide the amount.
.IP "--retry-delay <seconds>" .IP "--retry-delay <seconds>"
Make curl sleep this amount of time between each retry when a transfer has Make curl sleep this amount of time between 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
between retries). This option is only interestinf if \fI--retry\fP is also between retries). This option is only interesting if \fI--retry\fP is also
used. (Option added in 7.12.3) used. Setting this delay to zero will make curl use the default backoff time.
(Option added in 7.12.3)
Setting the delay to zero will make curl use the default backoff time. If this option is used multiple times, the last occurance decide the amount.
.IP "--retry-max-time <seconds>"
The retry timer is reset before the first transfer attempt. Retries will be
done as usual (see \fI--retry\fP) as long as the timer hasn't reached this
given limit. Notice that if the timer hasn't reached the limit, the request
will be made and while performing, it may take longer than this given time
period. To limit a single request\'s maximum time, use \fI-m/--max-time\fP.
Set this option to zero to not timeout retries. (Option added in 7.12.3)
If this option is used multiple times, the last occurance decide the amount. If this option is used multiple times, the last occurance decide the amount.
.IP "-s/--silent" .IP "-s/--silent"
@ -845,7 +851,7 @@ starting with '>' means data sent by curl, '<' means data received by curl
that is hidden in normal cases and lines starting with '*' means additional that is hidden in normal cases and lines starting with '*' means additional
info provided by curl. info provided by curl.
Note that if you want to see HTTP headers in the output, \fI-i/--include\fP Note that if you only want HTTP headers in the output, \fI-i/--include\fP
might be option you're looking for. might be option you're looking for.
If you think this option still doesn't give you enough details, consider using If you think this option still doesn't give you enough details, consider using

View File

@ -386,6 +386,7 @@ static void help(void)
" -R/--remote-time Set the remote file's time on the local output", " -R/--remote-time Set the remote file's time on the local output",
" --retry <num> Retry request <num> times if transient problems occur", " --retry <num> Retry request <num> times if transient problems occur",
" --retry-delay <seconds> When retrying, wait this many seconds between each", " --retry-delay <seconds> When retrying, wait this many seconds between each",
" --retry-max-time <seconds> Retry only within this period",
" -s/--silent Silent mode. Don't output anything", " -s/--silent Silent mode. Don't output anything",
" -S/--show-error Show error. With -s, make curl show errors when they occur", " -S/--show-error Show error. With -s, make curl show errors when they occur",
" --socks <host[:port]> Use SOCKS5 proxy on given host + port", " --socks <host[:port]> Use SOCKS5 proxy on given host + port",
@ -529,6 +530,7 @@ struct Configurable {
bool tcp_nodelay; bool tcp_nodelay;
long req_retry; /* number of retries */ long req_retry; /* number of retries */
long retry_delay; /* delay between retries (in seconds) */ long retry_delay; /* delay between retries (in seconds) */
long retry_maxtime; /* maximum time to keep retrying */
}; };
/* global variable to hold info about libcurl */ /* global variable to hold info about libcurl */
@ -1212,6 +1214,7 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
{"$f", "proxy-basic", FALSE}, {"$f", "proxy-basic", FALSE},
{"$g", "retry", TRUE}, {"$g", "retry", TRUE},
{"$h", "retry-delay", TRUE}, {"$h", "retry-delay", TRUE},
{"$i", "retry-max-time", TRUE},
{"0", "http1.0", FALSE}, {"0", "http1.0", FALSE},
{"1", "tlsv1", FALSE}, {"1", "tlsv1", FALSE},
{"2", "sslv2", FALSE}, {"2", "sslv2", FALSE},
@ -1555,6 +1558,10 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
if(str2num(&config->retry_delay, nextarg)) if(str2num(&config->retry_delay, nextarg))
return PARAM_BAD_NUMERIC; return PARAM_BAD_NUMERIC;
break; break;
case 'i': /* --retry-max-time */
if(str2num(&config->retry_maxtime, nextarg))
return PARAM_BAD_NUMERIC;
break;
} }
break; break;
case '#': /* added 19990617 larsa */ case '#': /* added 19990617 larsa */
@ -2809,6 +2816,7 @@ operate(struct Configurable *config, int argc, char *argv[])
long retry_numretries; long retry_numretries;
long retry_sleep = retry_sleep_default; long retry_sleep = retry_sleep_default;
long response; long response;
struct timeval retrystart;
char *env; char *env;
#ifdef CURLDEBUG #ifdef CURLDEBUG
@ -3513,10 +3521,17 @@ operate(struct Configurable *config, int argc, char *argv[])
retry_numretries = config->req_retry; retry_numretries = config->req_retry;
retrystart = curlx_tvnow();
do { do {
res = curl_easy_perform(curl); res = curl_easy_perform(curl);
if(retry_numretries) { /* if retry-max-time is non-zero, make sure we haven't exceeded the
time */
if(retry_numretries &&
(!config->retry_maxtime ||
(curlx_tvdiff(curlx_tvnow(), retrystart)<
config->retry_maxtime*1000)) ) {
enum { enum {
RETRY_NO, RETRY_NO,
RETRY_TIMEOUT, RETRY_TIMEOUT,