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