Source code for robgracli.http

import requests
from requests.exceptions import HTTPError
from requests.adapters import HTTPAdapter
from requests.packages.urllib3 import Retry
from .exceptions import BadResponse


[docs]class HttpClient(object): ''' A generic base class for HTTP clients, with connection pooling, sane timeouts and retries. :param connect_timeout: connection timeout, in seconds; :param read_timeout: read timeout, in seconds; :param max_retries: retry requests this number of time on network errors (only works for :meth:`get`); :param backoff_factor: factor used for exponential delays between retries; :param extra_requests_opts: additionnal keyworkd arguments passed to each :meth:`requests.Session.request` calls. ''' def __init__(self, connect_timeout=5, read_timeout=5, max_retries=3, backoff_factor=1, **extra_requests_opts): self.timeout = (connect_timeout, read_timeout) self.extra_requests_opts = extra_requests_opts self.session = requests.Session() self.session.mount('http://', get_adapter(max_retries, backoff_factor)) self.session.mount('https://', get_adapter(max_retries, backoff_factor)) def request(self, method, url, data=None, params=None, raise_for_status=True): response = self.session.request(method, url, data=data, params=params, timeout=self.timeout, **self.extra_requests_opts) if raise_for_status: try: response.raise_for_status() except HTTPError: raise BadResponse(response) return response def get(self, url, params=None, raise_for_status=True): return self.request('GET', url, data=None, params=params, raise_for_status=raise_for_status)
def get_adapter(max_retries, backoff_factor): retry = Retry(max_retries, backoff_factor=backoff_factor) return HTTPAdapter(max_retries=retry)