Skip to content

Commit

Permalink
Move logic reading related headers to ApiRateLimits class
Browse files Browse the repository at this point in the history
  • Loading branch information
RobinTTY committed Aug 18, 2024
1 parent 9423205 commit f9c0784
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 24 deletions.
24 changes: 23 additions & 1 deletion src/RobinTTY.NordigenApiClient/Models/Responses/ApiRateLimits.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using RobinTTY.NordigenApiClient.Endpoints;
using System.Net.Http.Headers;
using RobinTTY.NordigenApiClient.Endpoints;

namespace RobinTTY.NordigenApiClient.Models.Responses;

Expand Down Expand Up @@ -57,4 +58,25 @@ public ApiRateLimits(int requestLimit, int remainingRequests, int remainingTimeI
RemainingAccountRequests = remainingAccountRequests;
RemainingSecondsInAccountTimeWindow = remainingTimeInAccountTimeWindow;
}

/// <summary>
/// Creates a new instance of <see cref="ApiRateLimits" />.
/// </summary>
/// <param name="headers">The headers of the HTTP response containing the rate limit information.</param>
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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,6 @@ public NordigenApiResponse(HttpStatusCode statusCode, bool isSuccess, TResult? r
internal static async Task<NordigenApiResponse<TResult, TError>> 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
Expand All @@ -80,13 +79,13 @@ internal static async Task<NordigenApiResponse<TResult, TError>> FromHttpRespons
{
var result = await response.Content.ReadFromJsonAsync<TResult>(options, cancellationToken);
return new NordigenApiResponse<TResult, TError>(response.StatusCode, response.IsSuccessStatusCode,
result, null, rateLimits);
result, null, new ApiRateLimits(response.Headers));
}
else
{
var result = await response.Content.ReadFromJsonAsync<TError>(options, cancellationToken);
return new NordigenApiResponse<TResult, TError>(response.StatusCode, response.IsSuccessStatusCode,
null, result, rateLimits);
null, result, new ApiRateLimits(response.Headers));
}
}
catch (JsonException ex)
Expand All @@ -96,22 +95,4 @@ internal static async Task<NordigenApiResponse<TResult, TError>> 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);
}
}
4 changes: 2 additions & 2 deletions src/RobinTTY.NordigenApiClient/release-notes.txt
Original file line number Diff line number Diff line change
@@ -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
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

0 comments on commit f9c0784

Please sign in to comment.