public async Task <byte[]> DownloadReport(string link, int indexerId, string source, string host, string title) { var url = new Uri(link); // Limit grabs to 2 per second. if (link.IsNotNullOrWhiteSpace() && !link.StartsWith("magnet:")) { await _rateLimitService.WaitAndPulseAsync(url.Host, TimeSpan.FromSeconds(2)); } var indexer = _indexerFactory.GetInstance(_indexerFactory.Get(indexerId)); var success = false; var downloadedBytes = Array.Empty <byte>(); try { downloadedBytes = await indexer.Download(url); _indexerStatusService.RecordSuccess(indexerId); success = true; } catch (ReleaseUnavailableException) { _logger.Trace("Release {0} no longer available on indexer.", link); _eventAggregator.PublishEvent(new IndexerDownloadEvent(indexerId, success, source, host, title, url.AbsoluteUri)); throw; } catch (ReleaseDownloadException ex) { var http429 = ex.InnerException as TooManyRequestsException; if (http429 != null) { _indexerStatusService.RecordFailure(indexerId, http429.RetryAfter); } else { _indexerStatusService.RecordFailure(indexerId); } _eventAggregator.PublishEvent(new IndexerDownloadEvent(indexerId, success, source, host, title, url.AbsoluteUri)); throw; } _eventAggregator.PublishEvent(new IndexerDownloadEvent(indexerId, success, source, host, title, url.AbsoluteUri)); return(downloadedBytes); }
private async Task <HttpResponse> ExecuteRequestAsync(HttpRequest request, CookieContainer cookieContainer) { foreach (var interceptor in _requestInterceptors) { request = interceptor.PreRequest(request); } if (request.RateLimit != TimeSpan.Zero) { await _rateLimitService.WaitAndPulseAsync(request.Url.Host, request.RateLimit); } _logger.Trace(request); var stopWatch = Stopwatch.StartNew(); PrepareRequestCookies(request, cookieContainer); var response = await _httpDispatcher.GetResponseAsync(request, cookieContainer); HandleResponseCookies(response, cookieContainer); stopWatch.Stop(); _logger.Trace("{0} ({1} ms)", response, stopWatch.ElapsedMilliseconds); foreach (var interceptor in _requestInterceptors) { response = interceptor.PostResponse(response); } if (request.LogResponseContent) { _logger.Trace("Response content ({0} bytes): {1}", response.ResponseData.Length, response.Content); } return(response); }