1from time import sleep
2
3from requests import HTTPError, Timeout
4
5from stocra.models import StocraHTTPError
6from stocra.utils import calculate_sleep
7
8
9def retry_on_service_unavailable(error: StocraHTTPError) -> bool:
10 if not isinstance(error.exception, HTTPError):
11 return False
12
13 if error.exception.response.status_code != 503:
14 return False
15
16 if error.iteration > 10:
17 return False
18
19 sleep(calculate_sleep(error.iteration))
20 return True
21
22
23def retry_on_too_many_requests(error: StocraHTTPError) -> bool:
24 if not isinstance(error.exception, HTTPError):
25 return False
26
27 if error.exception.response.status_code != 429:
28 return False
29
30 if error.iteration > 10:
31 return False
32
33 sleep(int(error.exception.response.headers["Retry-After"]))
34 return True
35
36
37def retry_on_bad_gateway(error: StocraHTTPError) -> bool:
38 if not isinstance(error.exception, HTTPError):
39 return False
40
41 if error.exception.response.status_code != 502:
42 return False
43
44 if error.iteration > 10:
45 return False
46
47 sleep(calculate_sleep(error.iteration))
48 return True
49
50
51def retry_on_timeout_error(error: StocraHTTPError) -> bool:
52 if not isinstance(error.exception, Timeout):
53 return False
54
55 if error.iteration > 10:
56 return False
57
58 sleep(calculate_sleep(error.iteration))
59 return True