refactor(api-client): allow custom retry strategy

This commit is contained in:
jo 2023-02-26 13:17:36 +01:00 committed by Kyle Robbertze
parent e992d7147e
commit ad00272168
2 changed files with 28 additions and 12 deletions

View File

@ -26,20 +26,26 @@ class TimeoutHTTPAdapter(HTTPAdapter):
return super().send(request, *args, **kwargs) return super().send(request, *args, **kwargs)
def default_retry(max_retries: int = 5):
return Retry(
total=max_retries,
backoff_factor=2,
status_forcelist=[413, 429, 500, 502, 503, 504],
)
class Session(BaseSession): class Session(BaseSession):
base_url: Optional[str] base_url: Optional[str]
def __init__(self, base_url: Optional[str] = None): def __init__(
self,
base_url: Optional[str] = None,
retry: Optional[Retry] = None,
):
super().__init__() super().__init__()
self.base_url = base_url self.base_url = base_url
retry_strategy = Retry( adapter = TimeoutHTTPAdapter(max_retries=retry)
total=5,
backoff_factor=2,
status_forcelist=[413, 429, 500, 502, 503, 504],
)
adapter = TimeoutHTTPAdapter(max_retries=retry_strategy)
self.mount("http://", adapter) self.mount("http://", adapter)
self.mount("https://", adapter) self.mount("https://", adapter)
@ -61,9 +67,16 @@ class AbstractApiClient:
session: Session session: Session
base_url: str base_url: str
def __init__(self, base_url: str): def __init__(
self,
base_url: str,
retry: Optional[Retry] = None,
):
self.base_url = base_url self.base_url = base_url
self.session = Session(base_url=base_url) self.session = Session(
base_url=base_url,
retry=retry,
)
def _request( def _request(
self, self,

View File

@ -1,11 +1,14 @@
from ._client import AbstractApiClient, Response from ._client import AbstractApiClient, Response, default_retry
class ApiClient(AbstractApiClient): class ApiClient(AbstractApiClient):
VERSION = "2.0" VERSION = "2.0"
def __init__(self, base_url: str, api_key: str): def __init__(self, base_url: str, api_key: str):
super().__init__(base_url=base_url) super().__init__(
base_url=base_url,
retry=default_retry(),
)
self.session.headers.update({"Authorization": f"Api-Key {api_key}"}) self.session.headers.update({"Authorization": f"Api-Key {api_key}"})
def get_info(self, **kwargs) -> Response: def get_info(self, **kwargs) -> Response: