feedleware/feedleware/util.py

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