Skip to content

Commit ebb7a77

Browse files
timobrembeckclaudep
authored andcommitted
Enable re-checking after rate limit was hit
1 parent 5952085 commit ebb7a77

File tree

3 files changed

+24
-2
lines changed

3 files changed

+24
-2
lines changed

CHANGELOG

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
Unreleased
22

3-
* Ignore raw `post_save` signal (Timo Ludwig, #106).
3+
* Enable re-checking after rate limit was hit (Timo Ludwig, #153)
4+
* Ignore raw `post_save` signal (Timo Ludwig, #106)
45
* Retry with fallback user agent on forbidden response (Timo Ludwig, #159)
56
* Also set `redirect_to` on internal redirects (Timo Ludwig, #163)
67
* Add new fields to `Url` model:

linkcheck/models.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -428,7 +428,14 @@ def check_external(self, external_recheck_interval=EXTERNAL_RECHECK_INTERVAL):
428428
if not request_params['verify']:
429429
self.message += ', SSL certificate could not be verified'
430430

431-
self.last_checked = now()
431+
# When a rate limit was hit or the server returned an internal error, do not update
432+
# the last_checked date so the result is not cached for EXTERNAL_RECHECK_INTERVAL minutes
433+
if (
434+
not self.status_code or
435+
self.status_code != HTTPStatus.TOO_MANY_REQUESTS and
436+
self.status_code < 500
437+
):
438+
self.last_checked = now()
432439
self.save()
433440
return self.status
434441

linkcheck/tests/test_linkcheck.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -541,6 +541,20 @@ def test_external_check_timedout(self):
541541
self.assertEqual(uv.redirect_to, '')
542542
self.assertEqual(uv.type, 'external')
543543

544+
def test_external_check_rate_limit(self):
545+
uv = Url(url=f"{self.live_server_url}/http/429/")
546+
uv.check_url()
547+
self.assertEqual(uv.status, False)
548+
self.assertEqual(uv.last_checked, None)
549+
self.assertEqual(uv.message, '429 Too Many Requests')
550+
self.assertEqual(uv.anchor_message, '')
551+
self.assertEqual(uv.ssl_status, None)
552+
self.assertEqual(uv.ssl_message, 'Insecure link')
553+
self.assertEqual(uv.get_status_code_display(), '429 Too Many Requests')
554+
self.assertEqual(uv.get_redirect_status_code_display(), None)
555+
self.assertEqual(uv.redirect_to, '')
556+
self.assertEqual(uv.type, 'external')
557+
544558
def test_working_external_anchor(self):
545559
uv = Url(url=f"{self.live_server_url}/http/anchor/#anchor")
546560
uv.check_url()

0 commit comments

Comments
 (0)