@ -1,15 +1,19 @@
using System ;
using System ;
using System.Collections.Generic ;
using System.Collections.Generic ;
using System.Net ;
using System.Threading.Tasks ;
using System.Threading.Tasks ;
using FluentValidation.Results ;
using FluentValidation.Results ;
using NLog ;
using NLog ;
using NzbDrone.Common.Disk ;
using NzbDrone.Common.Disk ;
using NzbDrone.Common.Http ;
using NzbDrone.Core.Configuration ;
using NzbDrone.Core.Configuration ;
using NzbDrone.Core.Indexers ;
using NzbDrone.Core.Indexers ;
using NzbDrone.Core.Parser.Model ;
using NzbDrone.Core.Parser.Model ;
using NzbDrone.Core.RemotePathMappings ;
using NzbDrone.Core.RemotePathMappings ;
using NzbDrone.Core.ThingiProvider ;
using NzbDrone.Core.ThingiProvider ;
using NzbDrone.Core.Validation ;
using NzbDrone.Core.Validation ;
using Polly ;
using Polly.Retry ;
namespace NzbDrone.Core.Download
namespace NzbDrone.Core.Download
{
{
@ -21,6 +25,37 @@ namespace NzbDrone.Core.Download
protected readonly IRemotePathMappingService _remotePathMappingService ;
protected readonly IRemotePathMappingService _remotePathMappingService ;
protected readonly Logger _logger ;
protected readonly Logger _logger ;
protected ResiliencePipeline < HttpResponse > RetryStrategy = > new ResiliencePipelineBuilder < HttpResponse > ( )
. AddRetry ( new RetryStrategyOptions < HttpResponse >
{
ShouldHandle = static args = > args . Outcome switch
{
{ Result . HasHttpServerError : true } = > PredicateResult . True ( ) ,
{ Result . StatusCode : HttpStatusCode . RequestTimeout } = > PredicateResult . True ( ) ,
_ = > PredicateResult . False ( )
} ,
Delay = TimeSpan . FromSeconds ( 3 ) ,
MaxRetryAttempts = 2 ,
BackoffType = DelayBackoffType . Exponential ,
UseJitter = true ,
OnRetry = args = >
{
var exception = args . Outcome . Exception ;
if ( exception is not null )
{
_logger . Info ( exception , "Request for {0} failed with exception '{1}'. Retrying in {2}s." , Definition . Name , exception . Message , args . RetryDelay . TotalSeconds ) ;
}
else
{
_logger . Info ( "Request for {0} failed with status {1}. Retrying in {2}s." , Definition . Name , args . Outcome . Result ? . StatusCode , args . RetryDelay . TotalSeconds ) ;
}
return default ;
}
} )
. Build ( ) ;
public abstract string Name { get ; }
public abstract string Name { get ; }
public Type ConfigContract = > typeof ( TSettings ) ;
public Type ConfigContract = > typeof ( TSettings ) ;
@ -54,10 +89,7 @@ namespace NzbDrone.Core.Download
return GetType ( ) . Name ;
return GetType ( ) . Name ;
}
}
public abstract DownloadProtocol Protocol
public abstract DownloadProtocol Protocol { get ; }
{
get ;
}
public abstract Task < string > Download ( RemoteBook remoteBook , IIndexer indexer ) ;
public abstract Task < string > Download ( RemoteBook remoteBook , IIndexer indexer ) ;
public abstract IEnumerable < DownloadClientItem > GetItems ( ) ;
public abstract IEnumerable < DownloadClientItem > GetItems ( ) ;