diff --git a/src/NzbDrone.Core/IndexerProxies/FlareSolverr/FlareSolverr.cs b/src/NzbDrone.Core/IndexerProxies/FlareSolverr/FlareSolverr.cs index 5107bf151..cc92c4cc9 100644 --- a/src/NzbDrone.Core/IndexerProxies/FlareSolverr/FlareSolverr.cs +++ b/src/NzbDrone.Core/IndexerProxies/FlareSolverr/FlareSolverr.cs @@ -58,7 +58,7 @@ public override HttpResponse PostResponse(HttpResponse response) if (flaresolverrResponse.StatusCode != HttpStatusCode.OK && flaresolverrResponse.StatusCode != HttpStatusCode.InternalServerError) { - throw new FlareSolverrException("HTTP StatusCode not 200 or 500. Status is :" + response.StatusCode); + throw new FlareSolverrException("HTTP StatusCode not 200 or 500. Status is :" + flaresolverrResponse.StatusCode); } var result = JsonConvert.DeserializeObject(flaresolverrResponse.Content); @@ -71,9 +71,36 @@ public override HttpResponse PostResponse(HttpResponse response) InjectCookies(newRequest, result); - //Request again with User-Agent and Cookies from Flaresolverr + // Try cookie-based retry first so subsequent requests can + // reuse the cookies without going through FlareSolverr. var finalResponse = _httpClient.Execute(newRequest); + if (!CloudFlareDetectionService.IsCloudflareProtected(finalResponse)) + { + return finalResponse; + } + + // Cookie retry was blocked — fall back to FlareSolverr's response body. + // This happens when CF selectively challenges by IP/UA and FlareSolverr + // doesn't receive a challenge, so no cf_clearance cookie is returned. + if (result.Solution.Response.IsNotNullOrWhiteSpace()) + { + var headers = new HttpHeader(); + + if (result.Solution.Headers?.ContentType.IsNotNullOrWhiteSpace() == true) + { + headers.ContentType = result.Solution.Headers.ContentType; + } + + return new HttpResponse( + response.Request, + headers, + response.Cookies, + result.Solution.Response, + response.ElapsedTime, + HttpStatusCode.OK); + } + return finalResponse; }