using System; using System.Linq; using System.Net.Http; using System.Threading; using System.Threading.Tasks; using Polly; using Polly.Retry; using Sony.Filtr.Contracts.Abstractions; namespace Sony.Filtr.Utility { public class SpotifyRateLimitedHttpMessageHandler : DelegatingHandler { private readonly IRateLimiter _rateLimiter; private const int _SpotifyTooManyRequestsStatusCode = 429; private readonly RetryPolicy _tooManyRequestsRetryPolicy = Policy.HandleResult(r => (int)r.StatusCode == _SpotifyTooManyRequestsStatusCode).WaitAndRetryAsync(new[] { TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(3), TimeSpan.FromSeconds(5) }); public SpotifyRateLimitedHttpMessageHandler(HttpMessageHandler innerHandler, IRateLimiter rateLimiter) : base(innerHandler) { _rateLimiter = rateLimiter; } protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { await _rateLimiter.WaitToProceedAsync(TimeSpan.FromMinutes(1), cancellationToken); return await _tooManyRequestsRetryPolicy.ExecuteAsync(async () => await base.SendAsync(request, cancellationToken)); } } }