summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2021-09-06 09:08:01 +0200
committerDaniel Stenberg <daniel@haxx.se>2021-09-06 10:18:55 +0200
commit4669d05f102937842a4b2459566ff590d224de87 (patch)
treeddd4ab07fccfb012990409eb8e9f3ed4843f0020
parent37fb213a2eab80047014e74b0a1c64e9d4dc68f0 (diff)
downloadcurl-bagder/excessive-retry-after.tar.gz
curl: stop retry if Retry-After: is longer than allowedbagder/excessive-retry-after
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
-rw-r--r--src/tool_operate.c16
-rw-r--r--tests/data/Makefile.inc2
-rw-r--r--tests/data/test36649
3 files changed, 66 insertions, 1 deletions
diff --git a/src/tool_operate.c b/src/tool_operate.c
index 960f3020a..ca53d29f7 100644
--- a/src/tool_operate.c
+++ b/src/tool_operate.c
@@ -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)
diff --git a/tests/data/Makefile.inc b/tests/data/Makefile.inc
index 4fd9b6fe0..6c6ab09de 100644
--- a/tests/data/Makefile.inc
+++ b/tests/data/Makefile.inc
@@ -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 \
\
diff --git a/tests/data/test366 b/tests/data/test366
new file mode 100644
index 000000000..748ef4a0d
--- /dev/null
+++ b/tests/data/test366
@@ -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>