Skip to content

Commit 989cd81

Browse files
committed
Add rate limiting to authentication and API requests
1 parent eaf1422 commit 989cd81

File tree

1 file changed

+31
-15
lines changed

1 file changed

+31
-15
lines changed

lmax_python_sdk/client.py

Lines changed: 31 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -92,18 +92,27 @@ def _authenticate(self):
9292
}
9393

9494
headers = {"Content-Type": "application/json"}
95-
response = requests.post(
96-
self.base_url + endpoint,
97-
data=json.dumps(payload),
98-
headers=headers,
99-
timeout=5,
100-
)
10195

102-
if response.status_code == 200:
103-
return response.json()["token"]
104-
else:
105-
# It's better to raise the HTTPError directly from the response
106-
response.raise_for_status()
96+
# Rate limit the authentication request
97+
self.wait_for_rate_limit()
98+
99+
# Make the authentication request and handle HTTP errors (rate limit)
100+
count = 0
101+
while count < 3:
102+
try:
103+
response = requests.post(
104+
self.base_url + endpoint,
105+
data=json.dumps(payload),
106+
headers=headers,
107+
timeout=5,
108+
)
109+
if response.status_code == 200:
110+
return response.json()["token"]
111+
except requests.exceptions.HTTPError as e:
112+
print(e)
113+
time.sleep(1)
114+
115+
raise ValueError("Failed to authenticate after 3 attempts")
107116

108117
def _request(
109118
self,
@@ -125,10 +134,7 @@ def _request(
125134
Returns:
126135
typing.Dict[str, typing.Any]: The response from the LMAX API
127136
"""
128-
current_time = time.time()
129-
time_diff = current_time - self.last_request_time
130-
if time_diff < self.rate_limit_seconds:
131-
time.sleep(self.rate_limit_seconds - time_diff)
137+
self.wait_for_rate_limit()
132138

133139
headers = {
134140
"Content-Type": "application/json",
@@ -155,6 +161,9 @@ def _request(
155161
headers["Authorization"] = (
156162
f"Bearer {self.token}" # Update headers with new token
157163
)
164+
165+
self.wait_for_rate_limit()
166+
158167
response = requests.request( # Retry the request with the new token
159168
method,
160169
self.base_url + endpoint,
@@ -173,3 +182,10 @@ def _request(
173182
return response.json()
174183
else:
175184
response.raise_for_status()
185+
186+
def wait_for_rate_limit(self):
187+
"""Function to wait for the rate limit to expire."""
188+
current_time = time.time()
189+
time_diff = current_time - self.last_request_time
190+
if time_diff < self.rate_limit_seconds:
191+
time.sleep(self.rate_limit_seconds - time_diff)

0 commit comments

Comments
 (0)