curl: stop retry if Retry-After: is longer than allowed

If Retry-After: specifies a period that is longer than what fits within
--retry-max-time, then stop retrying immediately.

Added test 366 to verify.

Reported-by: Kari Pahula
Fixes #7675
Closes #7676
This commit is contained in:
Daniel Stenberg 2021-09-06 09:08:01 +02:00
parent 37fb213a2e
commit eb2a5171da
No known key found for this signature in database
GPG Key ID: 5CC908FDB71E12C2
3 changed files with 66 additions and 1 deletions

View File

@ -515,6 +515,21 @@ static CURLcode post_per_transfer(struct GlobalConfig *global,
sleeptime = LONG_MAX;
else
sleeptime = (long)retry_after * 1000; /* milliseconds */
/* if adding retry_after seconds to the process would exceed the
maximum time allowed for retrying, then exit the retries right
away */
if(config->retry_maxtime) {
curl_off_t seconds = tvdiff(tvnow(), per->retrystart)/1000;
if((CURL_OFF_T_MAX - retry_after < seconds) ||
(seconds + retry_after > config->retry_maxtime)) {
warnf(config->global, "The Retry-After: time would "
"make this command line exceed the maximum allowed time "
"for retries.");
goto noretry;
}
}
}
}
warnf(config->global, "Problem %s. "
@ -570,6 +585,7 @@ static CURLcode post_per_transfer(struct GlobalConfig *global,
return CURLE_OK;
}
} /* if retry_numretries */
noretry:
if((global->progressmode == CURL_PROGRESS_BAR) &&
per->progressbar.calls)

View File

@ -60,7 +60,7 @@ test325 test326 test327 test328 test329 test330 test331 test332 test333 \
test334 test335 test336 test337 test338 test339 test340 test341 test342 \
test343 test344 test345 test346 test347 test348 test349 test350 test351 \
test352 test353 test354 test355 test356 test357 test358 test359 test360 \
test361 test362 test363 test364 test365 \
test361 test362 test363 test364 test365 test366 \
\
test392 test393 test394 test395 test396 test397 \
\

49
tests/data/test366 Normal file
View File

@ -0,0 +1,49 @@
<testcase>
<info>
<keywords>
HTTP
HTTP GET
retry
</keywords>
</info>
#
# Server-side
<reply>
<data>
HTTP/1.1 503 OK
Date: Tue, 09 Nov 2010 14:49:00 GMT
Content-Length: 21
Retry-After: 200
server not available
</data>
</reply>
#
# Client-side
<client>
<server>
http
</server>
<name>
HTTP --retry-max-time with too long Retry-After
</name>
<command>
http://%HOSTIP:%HTTPPORT/%TESTNUMBER --retry 2 --retry-max-time 10
</command>
</client>
#
# Verify data after the test has been "shot"
<verify>
<protocol>
GET /%TESTNUMBER HTTP/1.1
Host: %HOSTIP:%HTTPPORT
User-Agent: curl/%VERSION
Accept: */*
</protocol>
</verify>
</testcase>