@@ -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