fix: Implement correct ratelimit handles for 429's (#2110)

* init

* fix errors
This commit is contained in:
Quin Lynch
2022-02-16 08:20:57 -04:00
committed by GitHub
parent abfba3c4bb
commit b2598d37b6
2 changed files with 20 additions and 14 deletions

View File

@@ -88,7 +88,7 @@ namespace Discord.Net.Queue
#if DEBUG_LIMITS #if DEBUG_LIMITS
Debug.WriteLine($"[{id}] (!) 429"); Debug.WriteLine($"[{id}] (!) 429");
#endif #endif
UpdateRateLimit(id, request, info, true); UpdateRateLimit(id, request, info, true, body:response.Stream);
} }
await _queue.RaiseRateLimitTriggered(Id, info, $"{request.Method} {request.Endpoint}").ConfigureAwait(false); await _queue.RaiseRateLimitTriggered(Id, info, $"{request.Method} {request.Endpoint}").ConfigureAwait(false);
continue; //Retry continue; //Retry
@@ -316,7 +316,7 @@ namespace Discord.Net.Queue
} }
} }
private void UpdateRateLimit(int id, IRequest request, RateLimitInfo info, bool is429, bool redirected = false) private void UpdateRateLimit(int id, IRequest request, RateLimitInfo info, bool is429, bool redirected = false, Stream body = null)
{ {
if (WindowCount == 0) if (WindowCount == 0)
return; return;
@@ -373,7 +373,17 @@ namespace Discord.Net.Queue
Debug.WriteLine($"[{id}] X-RateLimit-Remaining: " + info.Remaining.Value); Debug.WriteLine($"[{id}] X-RateLimit-Remaining: " + info.Remaining.Value);
_semaphore = info.Remaining.Value; _semaphore = info.Remaining.Value;
}*/ }*/
if (info.RetryAfter.HasValue) if (is429)
{
// use the payload reset after value
var payload = info.ReadRatelimitPayload(body);
resetTick = DateTimeOffset.UtcNow.Add(TimeSpan.FromSeconds(payload.RetryAfter));
#if DEBUG_LIMITS
Debug.WriteLine($"[{id}] Reset-After: {info.ResetAfter.Value} ({info.ResetAfter?.TotalMilliseconds} ms)");
#endif
}
else if (info.RetryAfter.HasValue)
{ {
//RetryAfter is more accurate than Reset, where available //RetryAfter is more accurate than Reset, where available
resetTick = DateTimeOffset.UtcNow.AddSeconds(info.RetryAfter.Value); resetTick = DateTimeOffset.UtcNow.AddSeconds(info.RetryAfter.Value);

View File

@@ -61,22 +61,18 @@ namespace Discord.Net
DateTimeOffset.TryParse(temp, CultureInfo.InvariantCulture, DateTimeStyles.None, out var date) ? DateTimeOffset.UtcNow - date : (TimeSpan?)null; DateTimeOffset.TryParse(temp, CultureInfo.InvariantCulture, DateTimeStyles.None, out var date) ? DateTimeOffset.UtcNow - date : (TimeSpan?)null;
} }
internal void ReadRatelimitPayload(Stream response) internal Ratelimit ReadRatelimitPayload(Stream response)
{
try
{ {
if (response != null && response.Length != 0) if (response != null && response.Length != 0)
{ {
using (TextReader text = new StreamReader(response)) using (TextReader text = new StreamReader(response))
using (JsonReader reader = new JsonTextReader(text)) using (JsonReader reader = new JsonTextReader(text))
{ {
var ratelimit = Discord.Rest.DiscordRestClient.Serializer.Deserialize<Ratelimit>(reader); return Discord.Rest.DiscordRestClient.Serializer.Deserialize<Ratelimit>(reader);
}
}
ResetAfter = TimeSpan.FromSeconds(ratelimit.RetryAfter); return null;
}
}
}
catch { }
} }
} }
} }