mirror of
https://github.com/C9Glax/tranga.git
synced 2025-10-11 13:19:48 +02:00
Use DelegatingHandler for RateLimits
Some checks failed
Docker Image CI / build (push) Has been cancelled
Some checks failed
Docker Image CI / build (push) Has been cancelled
This commit is contained in:
31
API/MangaDownloadClients/RateLimitHandler.cs
Normal file
31
API/MangaDownloadClients/RateLimitHandler.cs
Normal file
@@ -0,0 +1,31 @@
|
||||
using System.Net;
|
||||
using System.Threading.RateLimiting;
|
||||
using log4net;
|
||||
|
||||
namespace API.MangaDownloadClients;
|
||||
|
||||
public class RateLimitHandler() : DelegatingHandler(new HttpClientHandler())
|
||||
{
|
||||
private ILog Log { get; init; } = LogManager.GetLogger(typeof(RateLimitHandler));
|
||||
|
||||
private readonly RateLimiter _limiter = new SlidingWindowRateLimiter(new ()
|
||||
{
|
||||
AutoReplenishment = true,
|
||||
PermitLimit = 240,
|
||||
QueueLimit = 120,
|
||||
QueueProcessingOrder = QueueProcessingOrder.OldestFirst,
|
||||
SegmentsPerWindow = 60,
|
||||
Window = TimeSpan.FromSeconds(60)
|
||||
});
|
||||
|
||||
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
|
||||
{
|
||||
Log.Debug($"Requesting lease {request.RequestUri}");
|
||||
using RateLimitLease lease = await _limiter.AcquireAsync(permitCount: 1, cancellationToken);
|
||||
Log.Debug($"lease {lease.IsAcquired} {request.RequestUri}");
|
||||
|
||||
return lease.IsAcquired
|
||||
? await base.SendAsync(request, cancellationToken)
|
||||
: new (HttpStatusCode.TooManyRequests);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user