From f9c078403424b5f013c77439c74f0063a891cec9 Mon Sep 17 00:00:00 2001 From: RobinTTY Date: Sun, 18 Aug 2024 13:49:04 +0200 Subject: [PATCH] Move logic reading related headers to ApiRateLimits class --- .../Models/Responses/ApiRateLimits.cs | 24 ++++++++++++++++++- .../Models/Responses/NordigenApiResponse.cs | 23 ++---------------- .../release-notes.txt | 4 ++-- 3 files changed, 27 insertions(+), 24 deletions(-) diff --git a/src/RobinTTY.NordigenApiClient/Models/Responses/ApiRateLimits.cs b/src/RobinTTY.NordigenApiClient/Models/Responses/ApiRateLimits.cs index 9f7f1b8..a6609f6 100644 --- a/src/RobinTTY.NordigenApiClient/Models/Responses/ApiRateLimits.cs +++ b/src/RobinTTY.NordigenApiClient/Models/Responses/ApiRateLimits.cs @@ -1,4 +1,5 @@ -using RobinTTY.NordigenApiClient.Endpoints; +using System.Net.Http.Headers; +using RobinTTY.NordigenApiClient.Endpoints; namespace RobinTTY.NordigenApiClient.Models.Responses; @@ -57,4 +58,25 @@ public ApiRateLimits(int requestLimit, int remainingRequests, int remainingTimeI RemainingAccountRequests = remainingAccountRequests; RemainingSecondsInAccountTimeWindow = remainingTimeInAccountTimeWindow; } + + /// + /// Creates a new instance of . + /// + /// The headers of the HTTP response containing the rate limit information. + public ApiRateLimits(HttpResponseHeaders headers) + { + headers.TryGetValues("HTTP_X_RATELIMIT_LIMIT", out var requestLimitInTimeWindow); + headers.TryGetValues("HTTP_X_RATELIMIT_REMAINING", out var remainingRequestsInTimeWindow); + headers.TryGetValues("HTTP_X_RATELIMIT_RESET", out var remainingTimeInTimeWindow); + headers.TryGetValues("HTTP_X_RATELIMIT_ACCOUNT_SUCCESS_LIMIT", out var maxAccountRequestsInTimeWindow); + headers.TryGetValues("HTTP_X_RATELIMIT_ACCOUNT_SUCCESS_REMAINING", out var remainingAccountRequestsInTimeWindow); + headers.TryGetValues("HTTP_X_RATELIMIT_ACCOUNT_SUCCESS_RESET", out var remainingTimeInAccountTimeWindow); + + RequestLimit = requestLimitInTimeWindow != null ? int.Parse(requestLimitInTimeWindow.First()) : 0; + RemainingRequests = remainingRequestsInTimeWindow != null ? int.Parse(remainingRequestsInTimeWindow.First()) : 0; + RemainingSecondsInTimeWindow = remainingTimeInTimeWindow != null ? int.Parse(remainingTimeInTimeWindow.First()) : 0; + MaxAccountRequests = maxAccountRequestsInTimeWindow != null ? int.Parse(maxAccountRequestsInTimeWindow.First()) : 0; + RemainingAccountRequests = remainingAccountRequestsInTimeWindow != null ? int.Parse(remainingAccountRequestsInTimeWindow.First()) : 0; + RemainingSecondsInAccountTimeWindow = remainingTimeInAccountTimeWindow != null ? int.Parse(remainingTimeInAccountTimeWindow.First()) : 0; + } } diff --git a/src/RobinTTY.NordigenApiClient/Models/Responses/NordigenApiResponse.cs b/src/RobinTTY.NordigenApiClient/Models/Responses/NordigenApiResponse.cs index abf0ef4..c4dd9ee 100644 --- a/src/RobinTTY.NordigenApiClient/Models/Responses/NordigenApiResponse.cs +++ b/src/RobinTTY.NordigenApiClient/Models/Responses/NordigenApiResponse.cs @@ -68,7 +68,6 @@ public NordigenApiResponse(HttpStatusCode statusCode, bool isSuccess, TResult? r internal static async Task> FromHttpResponse(HttpResponseMessage response, JsonSerializerOptions? options = null, CancellationToken cancellationToken = default) { - var rateLimits = GetRateLimits(response); #if NET6_0_OR_GREATER var responseJson = await response.Content.ReadAsStringAsync(cancellationToken); #else @@ -80,13 +79,13 @@ internal static async Task> FromHttpRespons { var result = await response.Content.ReadFromJsonAsync(options, cancellationToken); return new NordigenApiResponse(response.StatusCode, response.IsSuccessStatusCode, - result, null, rateLimits); + result, null, new ApiRateLimits(response.Headers)); } else { var result = await response.Content.ReadFromJsonAsync(options, cancellationToken); return new NordigenApiResponse(response.StatusCode, response.IsSuccessStatusCode, - null, result, rateLimits); + null, result, new ApiRateLimits(response.Headers)); } } catch (JsonException ex) @@ -96,22 +95,4 @@ internal static async Task> FromHttpRespons $"The following JSON content caused the problem: {responseJson}", ex); } } - - private static ApiRateLimits GetRateLimits(HttpResponseMessage response) - { - response.Headers.TryGetValues("HTTP_X_RATELIMIT_LIMIT", out var requestLimitInTimeWindow); - response.Headers.TryGetValues("HTTP_X_RATELIMIT_REMAINING", out var remainingRequestsInTimeWindow); - response.Headers.TryGetValues("HTTP_X_RATELIMIT_RESET", out var remainingTimeInTimeWindow); - response.Headers.TryGetValues("HTTP_X_RATELIMIT_ACCOUNT_SUCCESS_LIMIT", out var maxAccountRequestsInTimeWindow); - response.Headers.TryGetValues("HTTP_X_RATELIMIT_ACCOUNT_SUCCESS_REMAINING", out var remainingAccountRequestsInTimeWindow); - response.Headers.TryGetValues("HTTP_X_RATELIMIT_ACCOUNT_SUCCESS_RESET", out var remainingTimeInAccountTimeWindow); - - return new ApiRateLimits( - requestLimitInTimeWindow != null ? int.Parse(requestLimitInTimeWindow.First()) : 0, - remainingRequestsInTimeWindow != null ? int.Parse(remainingRequestsInTimeWindow.First()) : 0, - remainingTimeInTimeWindow != null ? int.Parse(remainingTimeInTimeWindow.First()) : 0, - maxAccountRequestsInTimeWindow != null ? int.Parse(maxAccountRequestsInTimeWindow.First()) : 0, - remainingAccountRequestsInTimeWindow != null ? int.Parse(remainingAccountRequestsInTimeWindow.First()) : 0, - remainingTimeInAccountTimeWindow != null ? int.Parse(remainingTimeInAccountTimeWindow.First()) : 0); - } } diff --git a/src/RobinTTY.NordigenApiClient/release-notes.txt b/src/RobinTTY.NordigenApiClient/release-notes.txt index 6711509..4baa535 100644 --- a/src/RobinTTY.NordigenApiClient/release-notes.txt +++ b/src/RobinTTY.NordigenApiClient/release-notes.txt @@ -1,2 +1,2 @@ -This version improves many aspects of the library. Since this version contains breaking changes please check the release notes before updating. -For the full release notes please see: https://github.com/RobinTTY/NordigenApiClient/releases/tag/v10.0.0 \ No newline at end of file +Add the ability to check newly introduced rate limits in the GoCardless API. +Also see: https://bankaccountdata.zendesk.com/hc/en-gb/articles/11529584398236-Bank-API-Rate-Limits-and-Rate-Limit-Headers \ No newline at end of file