11from __future__ import annotations
22
33import time
4- from typing import NoReturn , Protocol
4+ from typing import Protocol
55
66import requests
77
@@ -190,20 +190,6 @@ def _get_headers(self) -> dict:
190190 }
191191 return headers
192192
193- def _raise_exception_from_response (self , response : requests .Response ) -> NoReturn :
194- raise APIException (
195- code = response .status_code ,
196- message = response .reason ,
197- details = {"content" : response .content },
198- )
199-
200- def _raise_exception_from_content (self , content : dict ) -> NoReturn :
201- raise APIException (
202- code = content ["error" ]["code" ],
203- message = content ["error" ]["message" ],
204- details = content ["error" ]["details" ],
205- )
206-
207193 def request ( # type: ignore[no-untyped-def]
208194 self ,
209195 method : str ,
@@ -229,23 +215,40 @@ def request( # type: ignore[no-untyped-def]
229215 ** kwargs ,
230216 )
231217
232- content = {}
218+ trace_id = response .headers .get ("X-Correlation-Id" )
219+ payload = {}
233220 try :
234221 if len (response .content ) > 0 :
235- content = response .json ()
236- except (TypeError , ValueError ):
237- self ._raise_exception_from_response (response )
222+ payload = response .json ()
223+ except (TypeError , ValueError ) as exc :
224+ raise APIException (
225+ code = response .status_code ,
226+ message = response .reason ,
227+ details = {"content" : response .content },
228+ trace_id = trace_id ,
229+ ) from exc
238230
239231 if not response .ok :
240- if content :
241- assert isinstance (content , dict )
242- if content ["error" ]["code" ] == "rate_limit_exceeded" and _tries < 5 :
243- time .sleep (_tries * self ._retry_wait_time )
244- _tries = _tries + 1
245- return self .request (method , url , _tries = _tries , ** kwargs )
246-
247- self ._raise_exception_from_content (content )
248- else :
249- self ._raise_exception_from_response (response )
250-
251- return content
232+ if not payload or "error" not in payload :
233+ raise APIException (
234+ code = response .status_code ,
235+ message = response .reason ,
236+ details = {"content" : response .content },
237+ trace_id = trace_id ,
238+ )
239+
240+ error : dict = payload ["error" ]
241+
242+ if error ["code" ] == "rate_limit_exceeded" and _tries < 5 :
243+ time .sleep (_tries * self ._retry_wait_time )
244+ _tries = _tries + 1
245+ return self .request (method , url , _tries = _tries , ** kwargs )
246+
247+ raise APIException (
248+ code = error ["code" ],
249+ message = error ["message" ],
250+ details = error ["details" ],
251+ trace_id = trace_id ,
252+ )
253+
254+ return payload
0 commit comments