2222use React \EventLoop \LoopInterface ;
2323use React \Promise \Deferred ;
2424use React \Promise \ExtendedPromiseInterface ;
25+ use RuntimeException ;
2526use SplQueue ;
2627use Throwable ;
2728
@@ -37,7 +38,7 @@ class Http
3738 *
3839 * @var string
3940 */
40- public const VERSION = 'v10.1.1 ' ;
41+ public const VERSION = 'v10.1.2 ' ;
4142
4243 /**
4344 * Current Discord HTTP API version.
@@ -316,6 +317,32 @@ protected function executeRequest(Request $request, Deferred $deferred = null):
316317
317318 // Discord Rate-limit
318319 if ($ statusCode == 429 ) {
320+ if (! isset ($ data ->global )) {
321+ if ($ response ->hasHeader ('X-RateLimit-Global ' )) {
322+ $ data ->global = $ response ->getHeader ('X-RateLimit-Global ' )[0 ] == true ;
323+ } else {
324+ // Some other 429
325+ $ this ->logger ->error ($ request . ' does not contain global rate-limit value ' );
326+ $ rateLimitError = new RuntimeException ('No rate limit global response ' , $ statusCode );
327+ $ deferred ->reject ($ rateLimitError );
328+ $ request ->getDeferred ()->reject ($ rateLimitError );
329+ return ;
330+ }
331+ }
332+
333+ if (! isset ($ data ->retry_after )) {
334+ if ($ response ->hasHeader ('Retry-After ' )) {
335+ $ data ->retry_after = $ response ->getHeader ('Retry-After ' )[0 ];
336+ } else {
337+ // Some other 429
338+ $ this ->logger ->error ($ request . ' does not contain retry after rate-limit value ' );
339+ $ rateLimitError = new RuntimeException ('No rate limit retry after response ' , $ statusCode );
340+ $ deferred ->reject ($ rateLimitError );
341+ $ request ->getDeferred ()->reject ($ rateLimitError );
342+ return ;
343+ }
344+ }
345+
319346 $ rateLimit = new RateLimit ($ data ->global , $ data ->retry_after );
320347 $ this ->logger ->warning ($ request .' hit rate-limit: ' .$ rateLimit );
321348
0 commit comments