You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Prowlarr/src/NzbDrone.Core/Indexers/IndexerHttpClient.cs

97 lines
3.0 KiB

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using NLog;
using NzbDrone.Common.Cache;
using NzbDrone.Common.Http;
using NzbDrone.Common.Http.Dispatchers;
using NzbDrone.Common.TPL;
using NzbDrone.Core.IndexerProxies;
using NzbDrone.Core.ThingiProvider;
namespace NzbDrone.Core.Indexers
{
public interface IIndexerHttpClient : IHttpClient
{
Task<HttpResponse> ExecuteProxiedAsync(HttpRequest request, ProviderDefinition definition);
HttpResponse ExecuteProxied(HttpRequest request, ProviderDefinition definition);
}
public class IndexerHttpClient : HttpClient, IIndexerHttpClient
{
private readonly IIndexerProxyFactory _indexerProxyFactory;
public IndexerHttpClient(IIndexerProxyFactory indexerProxyFactory,
IEnumerable<IHttpRequestInterceptor> requestInterceptors,
ICacheManager cacheManager,
IRateLimitService rateLimitService,
IHttpDispatcher httpDispatcher,
Logger logger)
: base(requestInterceptors, cacheManager, rateLimitService, httpDispatcher, logger)
{
_indexerProxyFactory = indexerProxyFactory;
}
public async Task<HttpResponse> ExecuteProxiedAsync(HttpRequest request, ProviderDefinition definition)
{
var selectedProxy = GetProxy(definition);
request = PreRequest(request, selectedProxy);
return PostResponse(await ExecuteAsync(request), selectedProxy);
}
public HttpResponse ExecuteProxied(HttpRequest request, ProviderDefinition definition)
{
var selectedProxy = GetProxy(definition);
request = PreRequest(request, selectedProxy);
return PostResponse(Execute(request), selectedProxy);
}
private IIndexerProxy GetProxy(ProviderDefinition definition)
{
//Skip DB call if no tags on the indexers
if (definition.Tags.Count == 0)
{
return null;
}
var proxies = _indexerProxyFactory.GetAvailableProviders();
IIndexerProxy selectedProxy = null;
foreach (var proxy in proxies)
{
if (definition.Tags.Intersect(proxy.Definition.Tags).Any())
{
selectedProxy = proxy;
break;
}
}
return selectedProxy;
}
private HttpRequest PreRequest(HttpRequest request, IIndexerProxy selectedProxy)
{
if (selectedProxy != null)
{
request = selectedProxy.PreRequest(request);
}
return request;
}
private HttpResponse PostResponse(HttpResponse response, IIndexerProxy selectedProxy)
{
if (selectedProxy != null)
{
response = selectedProxy.PostResponse(response);
}
return response;
}
}
}