stocra.asynchronous.error_handlers

 1import asyncio
 2
 3from aiohttp import ClientConnectionError, ClientResponseError
 4
 5from stocra.models import StocraHTTPError
 6from stocra.utils import calculate_sleep
 7
 8
 9async def retry_on_service_unavailable(error: StocraHTTPError) -> bool:
10    if not isinstance(error.exception, ClientResponseError):
11        return False
12
13    if error.exception.status != 503:
14        return False
15
16    if error.iteration > 10:
17        return False
18
19    await asyncio.sleep(calculate_sleep(error.iteration))
20    return True
21
22
23async def retry_on_connection_error(error: StocraHTTPError) -> bool:
24    if not isinstance(error.exception, ClientConnectionError):
25        return False
26
27    if error.iteration > 10:
28        return False
29
30    await asyncio.sleep(calculate_sleep(error.iteration))
31    return True
32
33
34async def retry_on_too_many_requests(error: StocraHTTPError) -> bool:
35    if not isinstance(error.exception, ClientResponseError):
36        return False
37
38    if error.exception.status != 429:
39        return False
40
41    if error.iteration > 10:
42        return False
43
44    headers = error.exception.headers
45
46    if not headers:
47        return False
48
49    retry_after = headers.get("Retry-After", 0)
50    await asyncio.sleep(int(retry_after))
51    return True
52
53
54async def retry_on_bad_gateway(error: StocraHTTPError) -> bool:
55    if not isinstance(error.exception, ClientResponseError):
56        return False
57
58    if error.exception.status != 502:
59        return False
60
61    if error.iteration > 10:
62        return False
63
64    await asyncio.sleep(calculate_sleep(error.iteration))
65    return True
66
67
68async def retry_on_timeout_error(error: StocraHTTPError) -> bool:
69    if not isinstance(error.exception, asyncio.TimeoutError):
70        return False
71
72    if error.iteration > 10:
73        return False
74
75    await asyncio.sleep(calculate_sleep(error.iteration))
76    return True
async def retry_on_service_unavailable(error: stocra.models.StocraHTTPError) -> bool:
10async def retry_on_service_unavailable(error: StocraHTTPError) -> bool:
11    if not isinstance(error.exception, ClientResponseError):
12        return False
13
14    if error.exception.status != 503:
15        return False
16
17    if error.iteration > 10:
18        return False
19
20    await asyncio.sleep(calculate_sleep(error.iteration))
21    return True
async def retry_on_connection_error(error: stocra.models.StocraHTTPError) -> bool:
24async def retry_on_connection_error(error: StocraHTTPError) -> bool:
25    if not isinstance(error.exception, ClientConnectionError):
26        return False
27
28    if error.iteration > 10:
29        return False
30
31    await asyncio.sleep(calculate_sleep(error.iteration))
32    return True
async def retry_on_too_many_requests(error: stocra.models.StocraHTTPError) -> bool:
35async def retry_on_too_many_requests(error: StocraHTTPError) -> bool:
36    if not isinstance(error.exception, ClientResponseError):
37        return False
38
39    if error.exception.status != 429:
40        return False
41
42    if error.iteration > 10:
43        return False
44
45    headers = error.exception.headers
46
47    if not headers:
48        return False
49
50    retry_after = headers.get("Retry-After", 0)
51    await asyncio.sleep(int(retry_after))
52    return True
async def retry_on_bad_gateway(error: stocra.models.StocraHTTPError) -> bool:
55async def retry_on_bad_gateway(error: StocraHTTPError) -> bool:
56    if not isinstance(error.exception, ClientResponseError):
57        return False
58
59    if error.exception.status != 502:
60        return False
61
62    if error.iteration > 10:
63        return False
64
65    await asyncio.sleep(calculate_sleep(error.iteration))
66    return True
async def retry_on_timeout_error(error: stocra.models.StocraHTTPError) -> bool:
69async def retry_on_timeout_error(error: StocraHTTPError) -> bool:
70    if not isinstance(error.exception, asyncio.TimeoutError):
71        return False
72
73    if error.iteration > 10:
74        return False
75
76    await asyncio.sleep(calculate_sleep(error.iteration))
77    return True