39 lines
987 B
Python
39 lines
987 B
Python
from datetime import datetime, timedelta
|
|
import isodate
|
|
import http
|
|
import urllib
|
|
import urllib.request
|
|
|
|
HTTPRequest = urllib.request.Request
|
|
HTTPResponse = http.client.HTTPResponse
|
|
HTTPException = http.client.HTTPException
|
|
|
|
|
|
def parse_iso_date(iso: str) -> datetime:
|
|
return datetime.fromisoformat(iso.replace("Z", "+00:00"))
|
|
|
|
|
|
def parse_iso_duration(iso: str) -> timedelta:
|
|
return isodate.parse_duration(iso)
|
|
|
|
|
|
def send_with_retry(request: HTTPRequest, retries: int) -> HTTPResponse:
|
|
"""
|
|
Send an HTTP request and retry in case of failure.
|
|
|
|
:param request: request to try sending
|
|
:param retries: number of retries
|
|
:returns: response sent by the server
|
|
:throws HTTPException: if the number of retries is exceeded
|
|
"""
|
|
last_err = HTTPException()
|
|
|
|
while retries:
|
|
try:
|
|
return urllib.request.urlopen(request, timeout=3)
|
|
except HTTPException as err:
|
|
retries -= 1
|
|
last_err = err
|
|
|
|
raise last_err
|