mirror of
https://github.com/JKorf/CryptoExchange.Net.git
synced 2026-08-20 12:53:02 +00:00
feature: Handle error 429 when connecting websocket (#213)
* feature: Handle error 429 when connecting websocket * Add preprocessor directive for NET6_0_OR_GREATER when checking for connection rate limit
This commit is contained in:
@@ -21,25 +21,35 @@ namespace CryptoExchange.Net.RateLimiting.Guards
|
||||
public string Name => "RetryAfterGuard";
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Description => $"Pause requests until after {After}";
|
||||
public string Description => $"Pause {Type} until after {After}";
|
||||
|
||||
/// <summary>
|
||||
/// The timestamp after which requests are allowed again
|
||||
/// </summary>
|
||||
public DateTime After { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// The type of rate limit item this guard is for
|
||||
/// </summary>
|
||||
public RateLimitItemType Type { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// ctor
|
||||
/// </summary>
|
||||
/// <param name="after"></param>
|
||||
public RetryAfterGuard(DateTime after)
|
||||
/// <param name="type"></param>
|
||||
public RetryAfterGuard(DateTime after, RateLimitItemType type)
|
||||
{
|
||||
After = after;
|
||||
Type = type;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public LimitCheck Check(RateLimitItemType type, RequestDefinition definition, string host, string? apiKey, int requestWeight)
|
||||
{
|
||||
if (type != Type)
|
||||
return LimitCheck.NotApplicable;
|
||||
|
||||
var dif = (After + _windowBuffer) - DateTime.UtcNow;
|
||||
if (dif <= TimeSpan.Zero)
|
||||
return LimitCheck.NotApplicable;
|
||||
|
||||
@@ -29,8 +29,9 @@ namespace CryptoExchange.Net.RateLimiting.Interfaces
|
||||
/// Set a RetryAfter guard, can be used when a server rate limit is hit and a RetryAfter header is specified
|
||||
/// </summary>
|
||||
/// <param name="retryAfter">The time after which requests can be send again</param>
|
||||
/// <param name="type">RateLimitType</param>
|
||||
/// <returns></returns>
|
||||
Task SetRetryAfterGuardAsync(DateTime retryAfter);
|
||||
Task SetRetryAfterGuardAsync(DateTime retryAfter, RateLimitItemType type = RateLimitItemType.Request);
|
||||
|
||||
/// <summary>
|
||||
/// Returns the 'retry after' timestamp if set
|
||||
|
||||
@@ -152,7 +152,7 @@ namespace CryptoExchange.Net.RateLimiting
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public async Task SetRetryAfterGuardAsync(DateTime retryAfter)
|
||||
public async Task SetRetryAfterGuardAsync(DateTime retryAfter, RateLimitItemType type)
|
||||
{
|
||||
await _semaphore.WaitAsync().ConfigureAwait(false);
|
||||
|
||||
@@ -160,7 +160,7 @@ namespace CryptoExchange.Net.RateLimiting
|
||||
{
|
||||
var retryAfterGuard = _guards.OfType<RetryAfterGuard>().SingleOrDefault();
|
||||
if (retryAfterGuard == null)
|
||||
_guards.Add(new RetryAfterGuard(retryAfter));
|
||||
_guards.Add(new RetryAfterGuard(retryAfter, type));
|
||||
else
|
||||
retryAfterGuard.UpdateAfter(retryAfter);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user