From 816969d0f59a1baef1ac581861000812d19dac44 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Thu, 13 Apr 2023 19:54:37 -0700 Subject: [PATCH] Add support for custom RetryAfter in RequestLimitReachedException (cherry picked from commit 47cf8e6430b7f7704ce2f1524fa9e3c8e6f9b47a) --- src/NzbDrone.Common/Http/HttpRequestBuilder.cs | 2 ++ src/NzbDrone.Common/Http/TooManyRequestsException.cs | 2 +- .../Exceptions/RequestLimitReachedException.cs | 11 ++++++++++- src/NzbDrone.Core/Indexers/HttpIndexerBase.cs | 12 ++++++++++-- 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/NzbDrone.Common/Http/HttpRequestBuilder.cs b/src/NzbDrone.Common/Http/HttpRequestBuilder.cs index 32fafd56f..93eebd039 100644 --- a/src/NzbDrone.Common/Http/HttpRequestBuilder.cs +++ b/src/NzbDrone.Common/Http/HttpRequestBuilder.cs @@ -20,6 +20,7 @@ namespace NzbDrone.Common.Http public Dictionary Segments { get; private set; } public HttpHeader Headers { get; private set; } public bool SuppressHttpError { get; set; } + public IEnumerable SuppressHttpErrorStatusCodes { get; set; } public bool LogHttpError { get; set; } public bool UseSimplifiedUserAgent { get; set; } public bool AllowAutoRedirect { get; set; } @@ -102,6 +103,7 @@ namespace NzbDrone.Common.Http { request.Method = Method; request.SuppressHttpError = SuppressHttpError; + request.SuppressHttpErrorStatusCodes = SuppressHttpErrorStatusCodes; request.LogHttpError = LogHttpError; request.UseSimplifiedUserAgent = UseSimplifiedUserAgent; request.AllowAutoRedirect = AllowAutoRedirect; diff --git a/src/NzbDrone.Common/Http/TooManyRequestsException.cs b/src/NzbDrone.Common/Http/TooManyRequestsException.cs index dcb261efa..117188b4e 100644 --- a/src/NzbDrone.Common/Http/TooManyRequestsException.cs +++ b/src/NzbDrone.Common/Http/TooManyRequestsException.cs @@ -1,4 +1,4 @@ -using System; +using System; namespace NzbDrone.Common.Http { diff --git a/src/NzbDrone.Core/Indexers/Exceptions/RequestLimitReachedException.cs b/src/NzbDrone.Core/Indexers/Exceptions/RequestLimitReachedException.cs index 2ad6ecd81..04c245f7b 100644 --- a/src/NzbDrone.Core/Indexers/Exceptions/RequestLimitReachedException.cs +++ b/src/NzbDrone.Core/Indexers/Exceptions/RequestLimitReachedException.cs @@ -1,9 +1,12 @@ -using NzbDrone.Common.Exceptions; +using System; +using NzbDrone.Common.Exceptions; namespace NzbDrone.Core.Indexers.Exceptions { public class RequestLimitReachedException : NzbDroneException { + public TimeSpan RetryAfter { get; private set; } + public RequestLimitReachedException(string message, params object[] args) : base(message, args) { @@ -13,5 +16,11 @@ namespace NzbDrone.Core.Indexers.Exceptions : base(message) { } + + public RequestLimitReachedException(string message, TimeSpan retryAfter) + : base(message) + { + RetryAfter = retryAfter; + } } } diff --git a/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs b/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs index b7b80bdb8..6a225f497 100644 --- a/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs +++ b/src/NzbDrone.Core/Indexers/HttpIndexerBase.cs @@ -207,9 +207,17 @@ namespace NzbDrone.Core.Indexers _indexerStatusService.RecordFailure(Definition.Id); _logger.Warn("{0} {1}", this, ex.Message); } - catch (RequestLimitReachedException) + catch (RequestLimitReachedException ex) { - _indexerStatusService.RecordFailure(Definition.Id, TimeSpan.FromHours(1)); + if (ex.RetryAfter != TimeSpan.Zero) + { + _indexerStatusService.RecordFailure(Definition.Id, ex.RetryAfter); + } + else + { + _indexerStatusService.RecordFailure(Definition.Id, TimeSpan.FromHours(1)); + } + _logger.Warn("API Request Limit reached for {0}", this); } catch (ApiKeyException)