diff --git a/CryptoExchange.Net/Clients/BaseRestClient.cs b/CryptoExchange.Net/Clients/BaseRestClient.cs index cb2b58f..e112bea 100644 --- a/CryptoExchange.Net/Clients/BaseRestClient.cs +++ b/CryptoExchange.Net/Clients/BaseRestClient.cs @@ -107,6 +107,7 @@ namespace CryptoExchange.Net /// Credits used for the request /// The JsonSerializer to use for deserialization /// Additional headers to send with the request + /// Ignore rate limits for this request /// [return: NotNull] protected virtual async Task> SendRequestAsync( @@ -120,7 +121,8 @@ namespace CryptoExchange.Net ArrayParametersSerialization? arraySerialization = null, int requestWeight = 1, JsonSerializer? deserializer = null, - Dictionary? additionalHeaders = null + Dictionary? additionalHeaders = null, + bool ignoreRatelimit = false ) where T : class { var requestId = NextId(); @@ -135,6 +137,16 @@ namespace CryptoExchange.Net } } + if (!ignoreRatelimit) + { + foreach (var limiter in apiClient.RateLimiters) + { + var limitResult = await limiter.LimitRequestAsync(log, uri.AbsolutePath, method, signed, apiClient.Options.ApiCredentials?.Key, apiClient.Options.RateLimitingBehaviour, requestWeight, cancellationToken).ConfigureAwait(false); + if (!limitResult.Success) + return new WebCallResult(limitResult.Error!); + } + } + log.Write(LogLevel.Debug, $"[{requestId}] Creating request for " + uri); if (signed && apiClient.AuthenticationProvider == null) { @@ -144,13 +156,7 @@ namespace CryptoExchange.Net var paramsPosition = parameterPosition ?? ParameterPositions[method]; var request = ConstructRequest(apiClient, uri, method, parameters, signed, paramsPosition, arraySerialization ?? this.arraySerialization, requestId, additionalHeaders); - foreach (var limiter in apiClient.RateLimiters) - { - var limitResult = await limiter.LimitRequestAsync(log, uri.AbsolutePath, method, signed, apiClient.Options.ApiCredentials?.Key, apiClient.Options.RateLimitingBehaviour, requestWeight, cancellationToken).ConfigureAwait(false); - if (!limitResult.Success) - return new WebCallResult(limitResult.Error!); - } - + string? paramString = ""; if (paramsPosition == HttpMethodParameterPosition.InBody) paramString = $" with request body '{request.Content}'"; @@ -296,6 +302,14 @@ namespace CryptoExchange.Net Dictionary? additionalHeaders) { parameters ??= new Dictionary(); + + for (var i = 0; i< parameters.Count; i++) + { + var kvp = parameters.ElementAt(i); + if (kvp.Value is Func delegateValue) + parameters[kvp.Key] = delegateValue(); + } + if (parameterPosition == HttpMethodParameterPosition.InUri) { foreach (var parameter in parameters)