From b1cd9b5412dd3037d5705ab1ca7a0b100b4a7650 Mon Sep 17 00:00:00 2001 From: JKorf Date: Wed, 28 Aug 2024 19:10:08 +0200 Subject: [PATCH] Fixed exception being thrown when waiting was canceled during rate limiting --- CryptoExchange.Net.UnitTests/RestClientTests.cs | 15 +++++++++++++++ CryptoExchange.Net/RateLimiting/RateLimitGate.cs | 8 ++++---- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/CryptoExchange.Net.UnitTests/RestClientTests.cs b/CryptoExchange.Net.UnitTests/RestClientTests.cs index ced33e7..e06535b 100644 --- a/CryptoExchange.Net.UnitTests/RestClientTests.cs +++ b/CryptoExchange.Net.UnitTests/RestClientTests.cs @@ -370,5 +370,20 @@ namespace CryptoExchange.Net.UnitTests var result2 = await rateLimiter.ProcessAsync(new TraceLogger(), 1, RateLimitItemType.Connection, new RequestDefinition("1", HttpMethod.Get), host2, "123", 1, RateLimitingBehaviour.Wait, default); Assert.That(expectLimited ? evnt != null : evnt == null); } + + [Test] + public async Task ConnectionRateLimiterCancel() + { + var rateLimiter = new RateLimitGate("Test"); + rateLimiter.AddGuard(new RateLimitGuard(RateLimitGuard.PerHost, new LimitItemTypeFilter(RateLimitItemType.Connection), 1, TimeSpan.FromSeconds(10), RateLimitWindowType.Fixed)); + + RateLimitEvent evnt = null; + rateLimiter.RateLimitTriggered += (x) => { evnt = x; }; + var ct = new CancellationTokenSource(TimeSpan.FromSeconds(0.2)); + + var result1 = await rateLimiter.ProcessAsync(new TraceLogger(), 1, RateLimitItemType.Connection, new RequestDefinition("1", HttpMethod.Get), "https://test.com", "123", 1, RateLimitingBehaviour.Wait, ct.Token); + var result2 = await rateLimiter.ProcessAsync(new TraceLogger(), 1, RateLimitItemType.Connection, new RequestDefinition("1", HttpMethod.Get), "https://test.com", "123", 1, RateLimitingBehaviour.Wait, ct.Token); + Assert.That(result2.Error, Is.TypeOf()); + } } } diff --git a/CryptoExchange.Net/RateLimiting/RateLimitGate.cs b/CryptoExchange.Net/RateLimiting/RateLimitGate.cs index 2d1fed1..ebde779 100644 --- a/CryptoExchange.Net/RateLimiting/RateLimitGate.cs +++ b/CryptoExchange.Net/RateLimiting/RateLimitGate.cs @@ -47,9 +47,9 @@ namespace CryptoExchange.Net.RateLimiting } catch (TaskCanceledException) { - // The semaphore has alraedy been released if the task was cancelled + // The semaphore has already been released if the task was cancelled release = false; - throw; + return new CallResult(new CancellationRequestedError()); } finally { @@ -80,9 +80,9 @@ namespace CryptoExchange.Net.RateLimiting } catch (TaskCanceledException) { - // The semaphore has alraedy been released if the task was cancelled + // The semaphore has already been released if the task was cancelled release = false; - throw; + return new CallResult(new CancellationRequestedError()); } finally {