Source code for core_https.requesters.requests_

# -*- coding: utf-8 -*-

"""Synchronous HTTP requester implementation backed by the requests library."""

from typing import Dict, Optional

import requests
import urllib3
from requests.adapters import HTTPAdapter

from core_https.requesters.base import IRequester
from .base import HTTPMethod


[docs] class RequestsRequester(IRequester): """ It uses `requests` to make the requests. .. code-block:: python from core_https.requesters.requests_ import RequestsRequester from core_https.utils import HTTPMethod requester: RequestsRequester = RequestsRequester() response = requester.request( method=HTTPMethod.GET, url=url, params={ "x-api-key": "..." }) print(response.json()) .. """
[docs] def __init__( self, session: Optional[requests.Session] = None, retries: Optional[urllib3.Retry] = None, backoff_factor: Optional[float] = None, **kwargs, ) -> None: """ :param session: Session to use for the requests. :param retries: Retry strategy to apply. Pass zero (0) to avoid retries. """ super().__init__(backoff_factor=backoff_factor, **kwargs) self.retries = retries backoff_factor = ( backoff_factor if backoff_factor is not None else self.backoff_factor if self.backoff_factor is not None else 0.5 ) if self.retries is None: self.retries = urllib3.Retry( status_forcelist=IRequester.RETRYABLE_ERRORS, backoff_factor=backoff_factor, total=3, ) adapter = HTTPAdapter( pool_connections=self.connector_limit, pool_maxsize=self.connector_limit_per_host, max_retries=self.retries, ) if session is None: session = requests.Session() session.mount("https://", adapter) session.mount("http://", adapter) self._session = session
[docs] @classmethod def engine(cls) -> str: return "requests"
[docs] def request( self, url: str, method: HTTPMethod = HTTPMethod.GET, headers: Optional[Dict[str, str]] = None, retries: Optional[urllib3.Retry] = None, backoff_factor: Optional[float] = None, session: Optional[requests.Session] = None, params: Optional[Dict] = None, timeout: Optional[float] = None, **kwargs, ) -> requests.Response: """ It makes the request using the session (externally provided or created if required) and return the response... :returns: `requests.Response` object. """ session_ = session or self._session response = session_.request( method=str(method.value), url=url, headers=headers, params=params, timeout=timeout if timeout is not None else self.timeout, **kwargs, ) try: if self.raise_for_status: response.raise_for_status() except requests.exceptions.HTTPError: status_code, info = response.status_code, response.text self.raise_custom_exception(status_code, info) return response