Fixed: Indexer failures not logged to history

pull/61/head
Qstick 3 years ago
parent 4cc52c415c
commit 5cb13e69d7

@ -68,6 +68,10 @@ namespace NzbDrone.Common.Http.Dispatchers
HttpWebResponse httpWebResponse;
var sw = new Stopwatch();
sw.Start();
try
{
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)

@ -11,16 +11,17 @@ namespace NzbDrone.Common.Http
{
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;
Headers = headers;
Cookies = cookies;
ResponseData = binaryData;
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;
Headers = headers;
@ -28,12 +29,14 @@ namespace NzbDrone.Common.Http
ResponseData = Headers.GetEncodingFromContentType().GetBytes(content);
_content = content;
StatusCode = statusCode;
ElapsedTime = elapsedTime;
}
public HttpRequest Request { get; private set; }
public HttpHeader Headers { get; private set; }
public CookieCollection Cookies { get; private set; }
public HttpStatusCode StatusCode { get; private set; }
public long ElapsedTime { get; private set; }
public byte[] ResponseData { get; private set; }
private string _content;
@ -93,7 +96,7 @@ namespace NzbDrone.Common.Http
where T : new()
{
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);
}

@ -167,7 +167,7 @@ namespace NzbDrone.Core.IndexerSearch
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;

@ -33,7 +33,7 @@ namespace NzbDrone.Core.Indexers.BroadcastheNet
case HttpStatusCode.NotFound:
throw new IndexerException(indexerResponse, "Indexer API call returned NotFound, the Indexer API may have changed.");
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:
if (indexerResponse.HttpResponse.StatusCode != HttpStatusCode.OK)
{

@ -46,7 +46,7 @@ namespace NzbDrone.Core.Indexers.Headphones
if (errorMessage == "Request limit reached")
{
throw new RequestLimitReachedException("API limit reached");
throw new RequestLimitReachedException(indexerResponse, "API limit reached");
}
throw new NewznabException(indexerResponse, errorMessage);

@ -45,7 +45,7 @@ namespace NzbDrone.Core.Indexers.Newznab
if (errorMessage == "Request limit reached")
{
throw new RequestLimitReachedException("API limit reached");
throw new RequestLimitReachedException(indexerResponse, "API limit reached");
}
throw new NewznabException(indexerResponse, errorMessage);

@ -42,7 +42,7 @@ namespace NzbDrone.Core.Indexers.Torznab
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);

@ -1,17 +1,23 @@
using NzbDrone.Common.Exceptions;
using NzbDrone.Common.Exceptions;
namespace NzbDrone.Core.Indexers.Exceptions
{
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)
{
_indexerResponse = response;
}
public RequestLimitReachedException(string message)
public RequestLimitReachedException(IndexerResponse response, string message)
: base(message)
{
_indexerResponse = response;
}
public IndexerResponse Response => _indexerResponse;
}
}

@ -302,6 +302,8 @@ namespace NzbDrone.Core.Indexers
}
catch (TooManyRequestsException ex)
{
result.Queries.Add(new IndexerQueryResult { ElapsedTime = ex.Response.ElapsedTime, StatusCode = (int)ex.Response.StatusCode });
if (ex.RetryAfter != TimeSpan.Zero)
{
_indexerStatusService.RecordFailure(Definition.Id, ex.RetryAfter);
@ -315,11 +317,13 @@ namespace NzbDrone.Core.Indexers
}
catch (HttpException ex)
{
result.Queries.Add(new IndexerQueryResult { ElapsedTime = ex.Response.ElapsedTime, StatusCode = (int)ex.Response.StatusCode });
_indexerStatusService.RecordFailure(Definition.Id);
_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));
_logger.Warn("API Request Limit reached for {0}", this);
}
@ -330,6 +334,7 @@ namespace NzbDrone.Core.Indexers
}
catch (CloudFlareCaptchaException ex)
{
result.Queries.Add(new IndexerQueryResult { ElapsedTime = ex.Response.ElapsedTime, StatusCode = (int)ex.Response.StatusCode });
_indexerStatusService.RecordFailure(Definition.Id);
ex.WithData("FeedUrl", url);
if (ex.IsExpired)
@ -343,6 +348,7 @@ namespace NzbDrone.Core.Indexers
}
catch (IndexerException ex)
{
result.Queries.Add(new IndexerQueryResult { ElapsedTime = ex.Response.HttpResponse.ElapsedTime, StatusCode = (int)ex.Response.HttpResponse.StatusCode });
_indexerStatusService.RecordFailure(Definition.Id);
_logger.Warn(ex, "{0}", url);
}
@ -384,7 +390,7 @@ namespace NzbDrone.Core.Indexers
return new IndexerQueryResult
{
Releases = releases,
ElapsedTime = response.ElapsedTime,
ElapsedTime = response.HttpResponse.ElapsedTime,
StatusCode = (int)response.HttpResponse.StatusCode
};
}
@ -450,13 +456,9 @@ namespace NzbDrone.Core.Indexers
}
}
var stopWatch = Stopwatch.StartNew();
request.HttpRequest.SuppressHttpError = true;
var response = await _httpClient.ExecuteAsync(request.HttpRequest);
stopWatch.Stop();
// Check reponse to see if auth is needed, if needed try again
if (CheckIfLoginNeeded(response))
{
@ -486,16 +488,14 @@ namespace NzbDrone.Core.Indexers
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)
{
var stopWatch = Stopwatch.StartNew();
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;
}

@ -7,11 +7,10 @@ namespace NzbDrone.Core.Indexers
private readonly IndexerRequest _indexerRequest;
private readonly HttpResponse _httpResponse;
public IndexerResponse(IndexerRequest indexerRequest, HttpResponse httpResponse, long elapsedTime = 0)
public IndexerResponse(IndexerRequest indexerRequest, HttpResponse httpResponse)
{
_indexerRequest = indexerRequest;
_httpResponse = httpResponse;
ElapsedTime = elapsedTime;
}
public IndexerRequest Request => _indexerRequest;
@ -21,6 +20,5 @@ namespace NzbDrone.Core.Indexers
public HttpResponse HttpResponse => _httpResponse;
public string Content => _httpResponse.Content;
public long ElapsedTime { get; private set; }
}
}

Loading…
Cancel
Save