mirror of
https://github.com/Prowlarr/Prowlarr.git
synced 2025-09-17 17:14:18 +02:00
Fixed: Indexer failures not logged to history
This commit is contained in:
@@ -68,6 +68,10 @@ namespace NzbDrone.Common.Http.Dispatchers
|
|||||||
|
|
||||||
HttpWebResponse httpWebResponse;
|
HttpWebResponse httpWebResponse;
|
||||||
|
|
||||||
|
var sw = new Stopwatch();
|
||||||
|
|
||||||
|
sw.Start();
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (request.ContentData != null)
|
if (request.ContentData != null)
|
||||||
@@ -144,7 +148,9 @@ namespace NzbDrone.Common.Http.Dispatchers
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return new HttpResponse(request, new HttpHeader(httpWebResponse.Headers), httpWebResponse.Cookies, data, httpWebResponse.StatusCode);
|
sw.Stop();
|
||||||
|
|
||||||
|
return new HttpResponse(request, new HttpHeader(httpWebResponse.Headers), httpWebResponse.Cookies, data, sw.ElapsedMilliseconds, httpWebResponse.StatusCode);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task DownloadFileAsync(string url, string fileName)
|
public async Task DownloadFileAsync(string url, string fileName)
|
||||||
|
@@ -11,16 +11,17 @@ namespace NzbDrone.Common.Http
|
|||||||
{
|
{
|
||||||
private static readonly Regex RegexSetCookie = new Regex("^(.*?)=(.*?)(?:;|$)", RegexOptions.Compiled);
|
private static readonly Regex RegexSetCookie = new Regex("^(.*?)=(.*?)(?:;|$)", RegexOptions.Compiled);
|
||||||
|
|
||||||
public HttpResponse(HttpRequest request, HttpHeader headers, CookieCollection cookies, byte[] binaryData, HttpStatusCode statusCode = HttpStatusCode.OK)
|
public HttpResponse(HttpRequest request, HttpHeader headers, CookieCollection cookies, byte[] binaryData, long elapsedTime = 0, HttpStatusCode statusCode = HttpStatusCode.OK)
|
||||||
{
|
{
|
||||||
Request = request;
|
Request = request;
|
||||||
Headers = headers;
|
Headers = headers;
|
||||||
Cookies = cookies;
|
Cookies = cookies;
|
||||||
ResponseData = binaryData;
|
ResponseData = binaryData;
|
||||||
StatusCode = statusCode;
|
StatusCode = statusCode;
|
||||||
|
ElapsedTime = elapsedTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
public HttpResponse(HttpRequest request, HttpHeader headers, CookieCollection cookies, string content, HttpStatusCode statusCode = HttpStatusCode.OK)
|
public HttpResponse(HttpRequest request, HttpHeader headers, CookieCollection cookies, string content, long elapsedTime = 0, HttpStatusCode statusCode = HttpStatusCode.OK)
|
||||||
{
|
{
|
||||||
Request = request;
|
Request = request;
|
||||||
Headers = headers;
|
Headers = headers;
|
||||||
@@ -28,12 +29,14 @@ namespace NzbDrone.Common.Http
|
|||||||
ResponseData = Headers.GetEncodingFromContentType().GetBytes(content);
|
ResponseData = Headers.GetEncodingFromContentType().GetBytes(content);
|
||||||
_content = content;
|
_content = content;
|
||||||
StatusCode = statusCode;
|
StatusCode = statusCode;
|
||||||
|
ElapsedTime = elapsedTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
public HttpRequest Request { get; private set; }
|
public HttpRequest Request { get; private set; }
|
||||||
public HttpHeader Headers { get; private set; }
|
public HttpHeader Headers { get; private set; }
|
||||||
public CookieCollection Cookies { get; private set; }
|
public CookieCollection Cookies { get; private set; }
|
||||||
public HttpStatusCode StatusCode { get; private set; }
|
public HttpStatusCode StatusCode { get; private set; }
|
||||||
|
public long ElapsedTime { get; private set; }
|
||||||
public byte[] ResponseData { get; private set; }
|
public byte[] ResponseData { get; private set; }
|
||||||
|
|
||||||
private string _content;
|
private string _content;
|
||||||
@@ -93,7 +96,7 @@ namespace NzbDrone.Common.Http
|
|||||||
where T : new()
|
where T : new()
|
||||||
{
|
{
|
||||||
public HttpResponse(HttpResponse response)
|
public HttpResponse(HttpResponse response)
|
||||||
: base(response.Request, response.Headers, response.Cookies, response.ResponseData, response.StatusCode)
|
: base(response.Request, response.Headers, response.Cookies, response.ResponseData, response.ElapsedTime, response.StatusCode)
|
||||||
{
|
{
|
||||||
Resource = Json.Deserialize<T>(response.Content);
|
Resource = Json.Deserialize<T>(response.Content);
|
||||||
}
|
}
|
||||||
|
@@ -167,7 +167,7 @@ namespace NzbDrone.Core.IndexerSearch
|
|||||||
|
|
||||||
foreach (var query in indexerReports.Queries)
|
foreach (var query in indexerReports.Queries)
|
||||||
{
|
{
|
||||||
_eventAggregator.PublishEvent(new IndexerQueryEvent(indexer.Definition.Id, criteriaBase, query.ElapsedTime, true, indexerReports.Releases.Count()));
|
_eventAggregator.PublishEvent(new IndexerQueryEvent(indexer.Definition.Id, criteriaBase, query.ElapsedTime, query.StatusCode == 200, indexerReports.Releases.Count()));
|
||||||
}
|
}
|
||||||
|
|
||||||
return indexerReports.Releases;
|
return indexerReports.Releases;
|
||||||
|
@@ -33,7 +33,7 @@ namespace NzbDrone.Core.Indexers.BroadcastheNet
|
|||||||
case HttpStatusCode.NotFound:
|
case HttpStatusCode.NotFound:
|
||||||
throw new IndexerException(indexerResponse, "Indexer API call returned NotFound, the Indexer API may have changed.");
|
throw new IndexerException(indexerResponse, "Indexer API call returned NotFound, the Indexer API may have changed.");
|
||||||
case HttpStatusCode.ServiceUnavailable:
|
case HttpStatusCode.ServiceUnavailable:
|
||||||
throw new RequestLimitReachedException("Cannot do more than 150 API requests per hour.");
|
throw new RequestLimitReachedException(indexerResponse, "Cannot do more than 150 API requests per hour.");
|
||||||
default:
|
default:
|
||||||
if (indexerResponse.HttpResponse.StatusCode != HttpStatusCode.OK)
|
if (indexerResponse.HttpResponse.StatusCode != HttpStatusCode.OK)
|
||||||
{
|
{
|
||||||
|
@@ -46,7 +46,7 @@ namespace NzbDrone.Core.Indexers.Headphones
|
|||||||
|
|
||||||
if (errorMessage == "Request limit reached")
|
if (errorMessage == "Request limit reached")
|
||||||
{
|
{
|
||||||
throw new RequestLimitReachedException("API limit reached");
|
throw new RequestLimitReachedException(indexerResponse, "API limit reached");
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new NewznabException(indexerResponse, errorMessage);
|
throw new NewznabException(indexerResponse, errorMessage);
|
||||||
|
@@ -45,7 +45,7 @@ namespace NzbDrone.Core.Indexers.Newznab
|
|||||||
|
|
||||||
if (errorMessage == "Request limit reached")
|
if (errorMessage == "Request limit reached")
|
||||||
{
|
{
|
||||||
throw new RequestLimitReachedException("API limit reached");
|
throw new RequestLimitReachedException(indexerResponse, "API limit reached");
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new NewznabException(indexerResponse, errorMessage);
|
throw new NewznabException(indexerResponse, errorMessage);
|
||||||
|
@@ -42,7 +42,7 @@ namespace NzbDrone.Core.Indexers.Torznab
|
|||||||
|
|
||||||
if (errorMessage == "Request limit reached")
|
if (errorMessage == "Request limit reached")
|
||||||
{
|
{
|
||||||
throw new RequestLimitReachedException("API limit reached");
|
throw new RequestLimitReachedException(indexerResponse, "API limit reached");
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new TorznabException("Torznab error detected: {0}", errorMessage);
|
throw new TorznabException("Torznab error detected: {0}", errorMessage);
|
||||||
|
@@ -1,17 +1,23 @@
|
|||||||
using NzbDrone.Common.Exceptions;
|
using NzbDrone.Common.Exceptions;
|
||||||
|
|
||||||
namespace NzbDrone.Core.Indexers.Exceptions
|
namespace NzbDrone.Core.Indexers.Exceptions
|
||||||
{
|
{
|
||||||
public class RequestLimitReachedException : NzbDroneException
|
public class RequestLimitReachedException : NzbDroneException
|
||||||
{
|
{
|
||||||
public RequestLimitReachedException(string message, params object[] args)
|
private readonly IndexerResponse _indexerResponse;
|
||||||
|
|
||||||
|
public RequestLimitReachedException(IndexerResponse response, string message, params object[] args)
|
||||||
: base(message, args)
|
: base(message, args)
|
||||||
{
|
{
|
||||||
|
_indexerResponse = response;
|
||||||
}
|
}
|
||||||
|
|
||||||
public RequestLimitReachedException(string message)
|
public RequestLimitReachedException(IndexerResponse response, string message)
|
||||||
: base(message)
|
: base(message)
|
||||||
{
|
{
|
||||||
|
_indexerResponse = response;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public IndexerResponse Response => _indexerResponse;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -302,6 +302,8 @@ namespace NzbDrone.Core.Indexers
|
|||||||
}
|
}
|
||||||
catch (TooManyRequestsException ex)
|
catch (TooManyRequestsException ex)
|
||||||
{
|
{
|
||||||
|
result.Queries.Add(new IndexerQueryResult { ElapsedTime = ex.Response.ElapsedTime, StatusCode = (int)ex.Response.StatusCode });
|
||||||
|
|
||||||
if (ex.RetryAfter != TimeSpan.Zero)
|
if (ex.RetryAfter != TimeSpan.Zero)
|
||||||
{
|
{
|
||||||
_indexerStatusService.RecordFailure(Definition.Id, ex.RetryAfter);
|
_indexerStatusService.RecordFailure(Definition.Id, ex.RetryAfter);
|
||||||
@@ -315,11 +317,13 @@ namespace NzbDrone.Core.Indexers
|
|||||||
}
|
}
|
||||||
catch (HttpException ex)
|
catch (HttpException ex)
|
||||||
{
|
{
|
||||||
|
result.Queries.Add(new IndexerQueryResult { ElapsedTime = ex.Response.ElapsedTime, StatusCode = (int)ex.Response.StatusCode });
|
||||||
_indexerStatusService.RecordFailure(Definition.Id);
|
_indexerStatusService.RecordFailure(Definition.Id);
|
||||||
_logger.Warn("{0} {1}", this, ex.Message);
|
_logger.Warn("{0} {1}", this, ex.Message);
|
||||||
}
|
}
|
||||||
catch (RequestLimitReachedException)
|
catch (RequestLimitReachedException ex)
|
||||||
{
|
{
|
||||||
|
result.Queries.Add(new IndexerQueryResult { ElapsedTime = ex.Response.HttpResponse.ElapsedTime, StatusCode = (int)ex.Response.HttpResponse.StatusCode });
|
||||||
_indexerStatusService.RecordFailure(Definition.Id, TimeSpan.FromHours(1));
|
_indexerStatusService.RecordFailure(Definition.Id, TimeSpan.FromHours(1));
|
||||||
_logger.Warn("API Request Limit reached for {0}", this);
|
_logger.Warn("API Request Limit reached for {0}", this);
|
||||||
}
|
}
|
||||||
@@ -330,6 +334,7 @@ namespace NzbDrone.Core.Indexers
|
|||||||
}
|
}
|
||||||
catch (CloudFlareCaptchaException ex)
|
catch (CloudFlareCaptchaException ex)
|
||||||
{
|
{
|
||||||
|
result.Queries.Add(new IndexerQueryResult { ElapsedTime = ex.Response.ElapsedTime, StatusCode = (int)ex.Response.StatusCode });
|
||||||
_indexerStatusService.RecordFailure(Definition.Id);
|
_indexerStatusService.RecordFailure(Definition.Id);
|
||||||
ex.WithData("FeedUrl", url);
|
ex.WithData("FeedUrl", url);
|
||||||
if (ex.IsExpired)
|
if (ex.IsExpired)
|
||||||
@@ -343,6 +348,7 @@ namespace NzbDrone.Core.Indexers
|
|||||||
}
|
}
|
||||||
catch (IndexerException ex)
|
catch (IndexerException ex)
|
||||||
{
|
{
|
||||||
|
result.Queries.Add(new IndexerQueryResult { ElapsedTime = ex.Response.HttpResponse.ElapsedTime, StatusCode = (int)ex.Response.HttpResponse.StatusCode });
|
||||||
_indexerStatusService.RecordFailure(Definition.Id);
|
_indexerStatusService.RecordFailure(Definition.Id);
|
||||||
_logger.Warn(ex, "{0}", url);
|
_logger.Warn(ex, "{0}", url);
|
||||||
}
|
}
|
||||||
@@ -384,7 +390,7 @@ namespace NzbDrone.Core.Indexers
|
|||||||
return new IndexerQueryResult
|
return new IndexerQueryResult
|
||||||
{
|
{
|
||||||
Releases = releases,
|
Releases = releases,
|
||||||
ElapsedTime = response.ElapsedTime,
|
ElapsedTime = response.HttpResponse.ElapsedTime,
|
||||||
StatusCode = (int)response.HttpResponse.StatusCode
|
StatusCode = (int)response.HttpResponse.StatusCode
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -450,13 +456,9 @@ namespace NzbDrone.Core.Indexers
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var stopWatch = Stopwatch.StartNew();
|
|
||||||
|
|
||||||
request.HttpRequest.SuppressHttpError = true;
|
request.HttpRequest.SuppressHttpError = true;
|
||||||
var response = await _httpClient.ExecuteAsync(request.HttpRequest);
|
var response = await _httpClient.ExecuteAsync(request.HttpRequest);
|
||||||
|
|
||||||
stopWatch.Stop();
|
|
||||||
|
|
||||||
// Check reponse to see if auth is needed, if needed try again
|
// Check reponse to see if auth is needed, if needed try again
|
||||||
if (CheckIfLoginNeeded(response))
|
if (CheckIfLoginNeeded(response))
|
||||||
{
|
{
|
||||||
@@ -486,16 +488,14 @@ namespace NzbDrone.Core.Indexers
|
|||||||
|
|
||||||
UpdateCookies(Cookies, DateTime.Now + TimeSpan.FromDays(30));
|
UpdateCookies(Cookies, DateTime.Now + TimeSpan.FromDays(30));
|
||||||
|
|
||||||
return new IndexerResponse(request, response, stopWatch.ElapsedMilliseconds);
|
return new IndexerResponse(request, response);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async Task<HttpResponse> ExecuteAuth(HttpRequest request)
|
protected async Task<HttpResponse> ExecuteAuth(HttpRequest request)
|
||||||
{
|
{
|
||||||
var stopWatch = Stopwatch.StartNew();
|
|
||||||
var response = await _httpClient.ExecuteAsync(request);
|
var response = await _httpClient.ExecuteAsync(request);
|
||||||
stopWatch.Stop();
|
|
||||||
|
|
||||||
_eventAggregator.PublishEvent(new IndexerAuthEvent(Definition.Id, !response.HasHttpError, stopWatch.ElapsedMilliseconds));
|
_eventAggregator.PublishEvent(new IndexerAuthEvent(Definition.Id, !response.HasHttpError, response.ElapsedTime));
|
||||||
|
|
||||||
return response;
|
return response;
|
||||||
}
|
}
|
||||||
|
@@ -7,11 +7,10 @@ namespace NzbDrone.Core.Indexers
|
|||||||
private readonly IndexerRequest _indexerRequest;
|
private readonly IndexerRequest _indexerRequest;
|
||||||
private readonly HttpResponse _httpResponse;
|
private readonly HttpResponse _httpResponse;
|
||||||
|
|
||||||
public IndexerResponse(IndexerRequest indexerRequest, HttpResponse httpResponse, long elapsedTime = 0)
|
public IndexerResponse(IndexerRequest indexerRequest, HttpResponse httpResponse)
|
||||||
{
|
{
|
||||||
_indexerRequest = indexerRequest;
|
_indexerRequest = indexerRequest;
|
||||||
_httpResponse = httpResponse;
|
_httpResponse = httpResponse;
|
||||||
ElapsedTime = elapsedTime;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public IndexerRequest Request => _indexerRequest;
|
public IndexerRequest Request => _indexerRequest;
|
||||||
@@ -21,6 +20,5 @@ namespace NzbDrone.Core.Indexers
|
|||||||
public HttpResponse HttpResponse => _httpResponse;
|
public HttpResponse HttpResponse => _httpResponse;
|
||||||
|
|
||||||
public string Content => _httpResponse.Content;
|
public string Content => _httpResponse.Content;
|
||||||
public long ElapsedTime { get; private set; }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user