|
19 | 19 | import threading
|
20 | 20 | from requests import codes as http_status_codes
|
21 | 21 | from requests import exceptions as requests_exceptions
|
| 22 | +from requests.adapters import HTTPAdapter |
| 23 | +from urllib3.util.retry import Retry |
22 | 24 |
|
23 | 25 | from . import exceptions as optimizely_exceptions
|
24 | 26 | from . import logger as optimizely_logger
|
@@ -200,6 +202,7 @@ def __init__(
|
200 | 202 | error_handler: Optional[BaseErrorHandler] = None,
|
201 | 203 | notification_center: Optional[NotificationCenter] = None,
|
202 | 204 | skip_json_validation: Optional[bool] = False,
|
| 205 | + retries: Optional[int] = 3, |
203 | 206 | ):
|
204 | 207 | """ Initialize config manager. One of sdk_key or datafile has to be set to be able to use.
|
205 | 208 |
|
@@ -244,6 +247,7 @@ def __init__(
|
244 | 247 | self.stopped = threading.Event()
|
245 | 248 | self._initialize_thread()
|
246 | 249 | self._polling_thread.start()
|
| 250 | + self.retries = retries |
247 | 251 |
|
248 | 252 | @staticmethod
|
249 | 253 | def get_datafile_url(sdk_key: Optional[str], url: Optional[str], url_template: Optional[str]) -> str:
|
@@ -391,9 +395,17 @@ def fetch_datafile(self) -> None:
|
391 | 395 | request_headers[enums.HTTPHeaders.IF_MODIFIED_SINCE] = self.last_modified
|
392 | 396 |
|
393 | 397 | try:
|
394 |
| - response = requests.get( |
395 |
| - self.datafile_url, headers=request_headers, timeout=enums.ConfigManager.REQUEST_TIMEOUT, |
396 |
| - ) |
| 398 | + print(f"Getting {self.datafile_url}") |
| 399 | + session = requests.Session() |
| 400 | + |
| 401 | + retries = Retry(total=self.retries, |
| 402 | + backoff_factor=0.1, |
| 403 | + status_forcelist=[ 500, 502, 503, 504 ]) |
| 404 | + adapter = HTTPAdapter(max_retries=retries) |
| 405 | + |
| 406 | + session.mount('http://', adapter) |
| 407 | + session.mount("https://", adapter) |
| 408 | + response = session.get(self.datafile_url, timeout=enums.ConfigManager.REQUEST_TIMEOUT) |
397 | 409 | except requests_exceptions.RequestException as err:
|
398 | 410 | self.logger.error(f'Fetching datafile from {self.datafile_url} failed. Error: {err}')
|
399 | 411 | return
|
@@ -475,9 +487,17 @@ def fetch_datafile(self) -> None:
|
475 | 487 | request_headers[enums.HTTPHeaders.IF_MODIFIED_SINCE] = self.last_modified
|
476 | 488 |
|
477 | 489 | try:
|
478 |
| - response = requests.get( |
479 |
| - self.datafile_url, headers=request_headers, timeout=enums.ConfigManager.REQUEST_TIMEOUT, |
480 |
| - ) |
| 490 | + print(f"Getting {self.datafile_url}") |
| 491 | + session = requests.Session() |
| 492 | + |
| 493 | + retries = Retry(total=self.retries, |
| 494 | + backoff_factor=0.1, |
| 495 | + status_forcelist=[ 500, 502, 503, 504 ]) |
| 496 | + adapter = HTTPAdapter(max_retries=retries) |
| 497 | + |
| 498 | + session.mount('http://', adapter) |
| 499 | + session.mount("https://", adapter) |
| 500 | + response = session.get(self.datafile_url, timeout=enums.ConfigManager.REQUEST_TIMEOUT) |
481 | 501 | except requests_exceptions.RequestException as err:
|
482 | 502 | self.logger.error(f'Fetching datafile from {self.datafile_url} failed. Error: {err}')
|
483 | 503 | return
|
|
0 commit comments