Skip to content

Commit c50c8fb

Browse files
authored
fix: 429 error not shown (#1125)
* chore: debug * refactor: error message * fix: attribute error * chore: debug * chore: debug * fix: display warning * feat: nicer warning * feat: enhanced warning * refactor: use ints * style: pre-commit * refactor: info * refactor: debug * fix: attribute error * fix: attribute error * refactor: remove debug print * refactor: remove 403
1 parent 050b2d3 commit c50c8fb

File tree

1 file changed

+26
-16
lines changed

1 file changed

+26
-16
lines changed

interactions/api/http/request.py

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -146,10 +146,20 @@ async def request(self, route: Route, **kwargs) -> Optional[Any]:
146146
async with self._session.request(
147147
route.method, route.__api__ + route.path, **kwargs
148148
) as response:
149+
if response.content_type == "application/json":
150+
data = await response.json()
151+
if isinstance(data, dict):
152+
message: Optional[str] = data.get("message")
153+
code: int = data.get("code", response.status)
154+
else:
155+
message, code = None, response.status
156+
else:
157+
data, message, code = None, None, response.status
149158

150-
data = await response.json(content_type=None)
151159
reset_after: float = float(
152-
response.headers.get("X-RateLimit-Reset-After", "0.0")
160+
response.headers.get(
161+
"X-RateLimit-Reset-After", response.headers.get("Retry-After", "0.0")
162+
)
153163
)
154164
remaining: str = response.headers.get("X-RateLimit-Remaining")
155165
_bucket: str = response.headers.get("X-RateLimit-Bucket")
@@ -161,40 +171,40 @@ async def request(self, route: Route, **kwargs) -> Optional[Any]:
161171
self.buckets[route.endpoint] = _bucket
162172
# real-time replacement/update/add if needed.
163173
if isinstance(data, dict) and (
164-
data.get("errors")
165-
or ((code := data.get("code")) and code != 429 and data.get("message"))
174+
data.get("errors") or (code and code != 429 and message)
166175
):
167176
log.debug(
168177
f"RETURN {response.status}: {dumps(data, indent=4, sort_keys=True)}"
169178
)
170179
# This "redundant" debug line is for debug use and tracing back the error codes.
171180

172-
raise LibraryException(
173-
message=data["message"], code=data["code"], severity=40, data=data
174-
)
175-
elif isinstance(data, dict) and data.get("code") == 0 and data.get("message"):
181+
raise LibraryException(message=message, code=code, severity=40, data=data)
182+
elif isinstance(data, dict) and code == 0 and message:
176183
log.debug(
177184
f"RETURN {response.status}: {dumps(data, indent=4, sort_keys=True)}"
178185
)
179186
# This "redundant" debug line is for debug use and tracing back the error codes.
180187

181188
raise LibraryException(
182-
message=f"'{data['message']}'. Make sure that your token is set properly.",
189+
message=f"'{message}'. Make sure that your token is set properly.",
183190
severity=50,
184191
)
185-
if response.status == 429:
192+
if code == 429:
193+
hours = int(reset_after // 3600)
194+
minutes = int((reset_after % 3600) // 60)
195+
seconds = int(reset_after % 60)
196+
log.warning(
197+
f"(429) {LibraryException.lookup(429)} Locking down future requests for "
198+
+ f"{f'{hours} hours ' if hours else ''}"
199+
+ f"{f'{minutes} minutes ' if minutes else ''}"
200+
+ f"{f'{seconds} seconds ' if seconds else ''}"
201+
)
186202
if is_global:
187-
log.warning(
188-
f"The HTTP client has encountered a global ratelimit. Locking down future requests for {reset_after} seconds."
189-
)
190203
self._global_lock.reset_after = reset_after
191204
self._loop.call_later(
192205
self._global_lock.reset_after, self._global_lock.lock.release
193206
)
194207
else:
195-
log.warning(
196-
f"The HTTP client has encountered a per-route ratelimit. Locking down future requests for {reset_after} seconds."
197-
)
198208
_limiter.reset_after = reset_after
199209
await asyncio.sleep(_limiter.reset_after)
200210
continue

0 commit comments

Comments
 (0)