Skip to content

Commit fef23e2

Browse files
authored
Added automatic retries for specific HTTP response codes. (#6)
- Implemented automatic retries when receiving a 500, 502, or 504 response. - Improved exception handling logic to handle edge cases
1 parent d4d8c25 commit fef23e2

File tree

2 files changed

+38
-5
lines changed

2 files changed

+38
-5
lines changed

laceworksdk/exceptions.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,11 @@ def __init__(self, response):
4848
except ValueError:
4949
logger.warning("Error parsing JSON response body")
5050

51-
if 'data' in self.details.keys():
52-
self.message = self.details["data"].get("message")
53-
elif 'message' in self.details.keys():
54-
self.message = self.details["message"]
51+
if self.details:
52+
if 'data' in self.details.keys():
53+
self.message = self.details["data"].get("message")
54+
elif 'message' in self.details.keys():
55+
self.message = self.details["message"]
5556
else:
5657
self.message = None
5758
"""The error message from the parsed API response."""

laceworksdk/http_session.py

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
import requests
99

1010
from datetime import datetime, timezone
11+
from requests.adapters import HTTPAdapter
12+
from requests.packages.urllib3.util.retry import Retry
1113

1214
from laceworksdk import version
1315
from laceworksdk.config import (
@@ -43,7 +45,7 @@ def __init__(self, account, subaccount, api_key, api_secret):
4345
super(HttpSession, self).__init__()
4446

4547
# Create a requests session
46-
self._session = requests.Session()
48+
self._session = self._retry_session()
4749

4850
# Set the base parameters
4951
self._api_key = api_key
@@ -54,6 +56,36 @@ def __init__(self, account, subaccount, api_key, api_secret):
5456
# Get an access token
5557
self._check_access_token()
5658

59+
def _retry_session(self,
60+
retries=3,
61+
backoff_factor=0.3,
62+
status_forcelist=(500, 502, 504)):
63+
"""
64+
A method to set up automatic retries on HTTP requests that fail.
65+
"""
66+
67+
# Create a new requests session
68+
session = requests.Session()
69+
70+
# Establish the retry criteria
71+
retry = Retry(
72+
total=retries,
73+
read=retries,
74+
connect=retries,
75+
status=retries,
76+
backoff_factor=backoff_factor,
77+
status_forcelist=status_forcelist,
78+
)
79+
80+
# Build the adapter with the retry criteria
81+
adapter = HTTPAdapter(max_retries=retry)
82+
83+
# Bind the adapter to HTTP/HTTPS calls
84+
session.mount('http://', adapter)
85+
session.mount('https://', adapter)
86+
87+
return session
88+
5789
def _check_access_token(self):
5890
"""
5991
A method to check the validity of the access token.

0 commit comments

Comments
 (0)