Remove werkzeug dependency by parsing Retry-After ourselves

Fixes #2409
Progress on #1301
This commit is contained in:
Peter Eckersley
2016-02-11 15:44:23 -08:00
parent 78bd8fb98f
commit df383ee6e4
2 changed files with 20 additions and 8 deletions
+20 -7
View File
@@ -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.
-1
View File
@@ -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