From d4169a32e7d0fc1caac451150f3688bbb2c16c88 Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+aa-turner@users.noreply.github.com> Date: Sun, 13 Aug 2023 19:39:08 +0100 Subject: [PATCH] Use ``parsedate_tz`` in the linkcheck builder --- sphinx/builders/linkcheck.py | 10 +++++----- tests/test_build_linkcheck.py | 4 +--- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/sphinx/builders/linkcheck.py b/sphinx/builders/linkcheck.py index 7fd00ba4c..1de3fe0eb 100644 --- a/sphinx/builders/linkcheck.py +++ b/sphinx/builders/linkcheck.py @@ -6,8 +6,7 @@ import json import re import socket import time -from datetime import datetime, timezone -from email.utils import parsedate_to_datetime +from email.utils import parsedate_tz from html.parser import HTMLParser from os import path from queue import PriorityQueue, Queue @@ -490,14 +489,15 @@ class HyperlinkAvailabilityCheckWorker(Thread): except ValueError: try: # An HTTP-date: time of next attempt. - until = parsedate_to_datetime(retry_after) + parsed = parsedate_tz(retry_after) + # the 10th element is the GMT offset in seconds + next_check = time.mktime(parsed[:9]) - parsed[9] except (TypeError, ValueError): # TypeError: Invalid date format. # ValueError: Invalid date, e.g. Oct 52th. pass else: - next_check = datetime.timestamp(until) - delay = (until - datetime.now(timezone.utc)).total_seconds() + delay = next_check - time.time() else: next_check = time.time() + delay netloc = urlsplit(response_url).netloc diff --git a/tests/test_build_linkcheck.py b/tests/test_build_linkcheck.py index 04b093140..ec6d42d47 100644 --- a/tests/test_build_linkcheck.py +++ b/tests/test_build_linkcheck.py @@ -9,7 +9,6 @@ import textwrap import time import wsgiref.handlers from base64 import b64encode -from datetime import datetime from os import path from queue import Queue from unittest import mock @@ -775,8 +774,7 @@ def test_too_many_requests_retry_after_int_delay(app, capsys, status): @pytest.mark.sphinx('linkcheck', testroot='linkcheck-localserver', freshenv=True) def test_too_many_requests_retry_after_HTTP_date(app, capsys): - now = datetime.now().timetuple() - retry_after = wsgiref.handlers.format_date_time(time.mktime(now)) + retry_after = wsgiref.handlers.format_date_time(time.time()) with http_server(make_retry_after_handler([(429, retry_after), (200, None)])): app.build() content = (app.outdir / 'output.json').read_text(encoding='utf8')