mirror of
https://github.com/certbot/certbot.git
synced 2026-08-02 00:22:28 +02:00
Remove werkzeug dependency by parsing Retry-After ourselves
Fixes #2409 Progress on #1301
This commit is contained in:
+20
-7
@@ -11,13 +11,16 @@ from six.moves import http_client # pylint: disable=import-error
|
|||||||
import OpenSSL
|
import OpenSSL
|
||||||
import requests
|
import requests
|
||||||
import sys
|
import sys
|
||||||
import werkzeug
|
|
||||||
|
|
||||||
from acme import errors
|
from acme import errors
|
||||||
from acme import jose
|
from acme import jose
|
||||||
from acme import jws
|
from acme import jws
|
||||||
from acme import messages
|
from acme import messages
|
||||||
|
|
||||||
|
try:
|
||||||
|
from email.utils import parsedate_tz
|
||||||
|
except ImportError: # pragma: no cover
|
||||||
|
from email.Utils import parsedate_tz
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@@ -245,7 +248,8 @@ class Client(object): # pylint: disable=too-many-instance-attributes
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def retry_after(cls, response, default):
|
def retry_after(cls, response, default):
|
||||||
"""Compute next `poll` time based on response ``Retry-After`` header.
|
"""Compute next `poll` time based on response ``Retry-After`` header,
|
||||||
|
per https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.37
|
||||||
|
|
||||||
:param requests.Response response: Response from `poll`.
|
:param requests.Response response: Response from `poll`.
|
||||||
:param int default: Default value (in seconds), used when
|
:param int default: Default value (in seconds), used when
|
||||||
@@ -256,17 +260,26 @@ class Client(object): # pylint: disable=too-many-instance-attributes
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
retry_after = response.headers.get('Retry-After', str(default))
|
retry_after = response.headers.get('Retry-After', str(default))
|
||||||
|
now = datetime.datetime.now()
|
||||||
|
year_now = now[0]
|
||||||
try:
|
try:
|
||||||
seconds = int(retry_after)
|
seconds = int(retry_after)
|
||||||
except ValueError:
|
except ValueError:
|
||||||
# pylint: disable=no-member
|
# pylint: disable=no-member
|
||||||
decoded = werkzeug.parse_date(retry_after) # RFC1123
|
t = parsedate_tz(value.strip())
|
||||||
if decoded is None:
|
try:
|
||||||
|
year = t[0] # raises TypeError if t is None
|
||||||
|
# Handle two-digit years -- but any webserver that thinks
|
||||||
|
# "retry after 99" means "come back after 1999" is.. deprecated
|
||||||
|
if year >= 0 and year < 100:
|
||||||
|
year += 2000
|
||||||
|
t_corrected = datetime(*([year] + t[1:7])) # raises ValueError
|
||||||
|
tz = t[-1] if t[-1] else 0
|
||||||
|
return t_corrected - timedelta(tz) # raises OverflowError
|
||||||
|
except (TypeError, ValueError, OverflowError):
|
||||||
seconds = default
|
seconds = default
|
||||||
else:
|
|
||||||
return decoded
|
|
||||||
|
|
||||||
return datetime.datetime.now() + datetime.timedelta(seconds=seconds)
|
return now + datetime.timedelta(seconds=seconds)
|
||||||
|
|
||||||
def poll(self, authzr):
|
def poll(self, authzr):
|
||||||
"""Poll Authorization Resource for status.
|
"""Poll Authorization Resource for status.
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ install_requires = [
|
|||||||
'requests',
|
'requests',
|
||||||
'setuptools', # pkg_resources
|
'setuptools', # pkg_resources
|
||||||
'six',
|
'six',
|
||||||
'werkzeug',
|
|
||||||
]
|
]
|
||||||
|
|
||||||
# env markers in extras_require cause problems with older pip: #517
|
# env markers in extras_require cause problems with older pip: #517
|
||||||
|
|||||||
Reference in New Issue
Block a user