From 17008ace5c775c76e95a5f756642357f8572bea5 Mon Sep 17 00:00:00 2001 From: Qstick Date: Thu, 18 Nov 2021 21:46:42 -0600 Subject: [PATCH] Fixed: (FlareSolverr) Don't attempt solve if CF not detected. Fixes #478 --- .../FlareSolverr/FlareSolverr.cs | 33 +++++++++++++++++-- .../Cardigann/CardigannRequestGenerator.cs | 2 +- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/NzbDrone.Core/IndexerProxies/FlareSolverr/FlareSolverr.cs b/src/NzbDrone.Core/IndexerProxies/FlareSolverr/FlareSolverr.cs index 3e2344c1a..5f48a435d 100644 --- a/src/NzbDrone.Core/IndexerProxies/FlareSolverr/FlareSolverr.cs +++ b/src/NzbDrone.Core/IndexerProxies/FlareSolverr/FlareSolverr.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Net; using FluentValidation.Results; using Newtonsoft.Json; @@ -14,6 +15,8 @@ namespace NzbDrone.Core.IndexerProxies.FlareSolverr { public class FlareSolverr : HttpIndexerProxyBase { + private static readonly HashSet CloudflareServerNames = new HashSet { "cloudflare", "cloudflare-nginx" }; + public FlareSolverr(IProwlarrCloudRequestBuilder cloudRequestBuilder, IHttpClient httpClient, Logger logger, ILocalizationService localizationService) : base(cloudRequestBuilder, httpClient, logger, localizationService) { @@ -23,19 +26,28 @@ public FlareSolverr(IProwlarrCloudRequestBuilder cloudRequestBuilder, IHttpClien public override HttpRequest PreRequest(HttpRequest request) { - return GenerateFlareSolverrRequest(request); + //Try original request first, detect CF in post response + return request; } public override HttpResponse PostResponse(HttpResponse response) { + if (!IsCloudflareProtected(response)) + { + _logger.Debug("CF Protection not detected, returning original response"); + return response; + } + + var flaresolverrResponse = _httpClient.Execute(GenerateFlareSolverrRequest(response.Request)); + FlareSolverrResponse result = null; - if (response.StatusCode != HttpStatusCode.OK && response.StatusCode != HttpStatusCode.InternalServerError) + if (flaresolverrResponse.StatusCode != HttpStatusCode.OK && flaresolverrResponse.StatusCode != HttpStatusCode.InternalServerError) { throw new FlareSolverrException("HTTP StatusCode not 200 or 500. Status is :" + response.StatusCode); } - result = JsonConvert.DeserializeObject(response.Content); + result = JsonConvert.DeserializeObject(flaresolverrResponse.Content); var cookieCollection = new CookieCollection(); var responseHeader = new HttpHeader(); @@ -51,6 +63,20 @@ public override HttpResponse PostResponse(HttpResponse response) return newResponse; } + private static bool IsCloudflareProtected(HttpResponse response) + { + // check status code + if (response.StatusCode.Equals(HttpStatusCode.ServiceUnavailable) || + response.StatusCode.Equals(HttpStatusCode.Forbidden)) + { + // check response headers + return response.Headers.Any(i => + i.Key != null && i.Key == "server" && CloudflareServerNames.Contains(i.Value.ToLower())); + } + + return false; + } + private HttpRequest GenerateFlareSolverrRequest(HttpRequest request) { FlareSolverrRequest req; @@ -152,6 +178,7 @@ public class FlareSolverrRequest public string Cmd { get; set; } public string Url { get; set; } public string UserAgent { get; set; } + public Cookie[] Cookies { get; set; } } public class FlareSolverrRequestGet : FlareSolverrRequest diff --git a/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannRequestGenerator.cs b/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannRequestGenerator.cs index e74eb57bb..9352bca44 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannRequestGenerator.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannRequestGenerator.cs @@ -925,7 +925,7 @@ public bool CheckIfLoginIsNeeded(HttpResponse response) } // Only run html test selector on html responses - if (response.Headers.ContentType.Contains("text/html")) + if (response.Headers.ContentType?.Contains("text/html") ?? true) { var parser = new HtmlParser(); var document = parser.ParseDocument(response.Content);