From 0f52258d53258081f26887e60fa61bd48f40d2bc Mon Sep 17 00:00:00 2001 From: Qstick Date: Sun, 5 Dec 2021 17:26:58 -0600 Subject: [PATCH] Fixed: (Flaresolverr) YggCookie and YggTorrent Issues --- .../Http/Dispatchers/ManagedHttpDispatcher.cs | 3 +- src/NzbDrone.Common/Http/HttpHeader.cs | 14 +++++- .../FlareSolverr/FlareSolverr.cs | 48 +++++++++++++++---- 3 files changed, 53 insertions(+), 12 deletions(-) diff --git a/src/NzbDrone.Common/Http/Dispatchers/ManagedHttpDispatcher.cs b/src/NzbDrone.Common/Http/Dispatchers/ManagedHttpDispatcher.cs index e20341305..e5bcb6432 100644 --- a/src/NzbDrone.Common/Http/Dispatchers/ManagedHttpDispatcher.cs +++ b/src/NzbDrone.Common/Http/Dispatchers/ManagedHttpDispatcher.cs @@ -254,7 +254,8 @@ namespace NzbDrone.Common.Http.Dispatchers webRequest.TransferEncoding = header.Value; break; case "User-Agent": - throw new NotSupportedException("User-Agent other than Prowlarr not allowed."); + webRequest.UserAgent = header.Value; + break; case "Proxy-Connection": throw new NotImplementedException(); default: diff --git a/src/NzbDrone.Common/Http/HttpHeader.cs b/src/NzbDrone.Common/Http/HttpHeader.cs index 2794f6dc4..b78e27460 100644 --- a/src/NzbDrone.Common/Http/HttpHeader.cs +++ b/src/NzbDrone.Common/Http/HttpHeader.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections; using System.Collections.Generic; using System.Collections.Specialized; @@ -107,6 +107,18 @@ namespace NzbDrone.Common.Http } } + public string UserAgent + { + get + { + return GetSingleValue("User-Agent"); + } + set + { + SetSingleValue("User-Agent", value); + } + } + public string Accept { get diff --git a/src/NzbDrone.Core/IndexerProxies/FlareSolverr/FlareSolverr.cs b/src/NzbDrone.Core/IndexerProxies/FlareSolverr/FlareSolverr.cs index 8751519b9..3215c0a39 100644 --- a/src/NzbDrone.Core/IndexerProxies/FlareSolverr/FlareSolverr.cs +++ b/src/NzbDrone.Core/IndexerProxies/FlareSolverr/FlareSolverr.cs @@ -5,7 +5,9 @@ using System.Net; using FluentValidation.Results; using Newtonsoft.Json; using NLog; +using NzbDrone.Common.Cache; using NzbDrone.Common.Cloud; +using NzbDrone.Common.Extensions; using NzbDrone.Common.Http; using NzbDrone.Common.Serializer; using NzbDrone.Core.Localization; @@ -16,10 +18,12 @@ namespace NzbDrone.Core.IndexerProxies.FlareSolverr public class FlareSolverr : HttpIndexerProxyBase { private static readonly HashSet CloudflareServerNames = new HashSet { "cloudflare", "cloudflare-nginx" }; + private readonly ICached _cache; - public FlareSolverr(IProwlarrCloudRequestBuilder cloudRequestBuilder, IHttpClient httpClient, Logger logger, ILocalizationService localizationService) + public FlareSolverr(IProwlarrCloudRequestBuilder cloudRequestBuilder, IHttpClient httpClient, Logger logger, ILocalizationService localizationService, ICacheManager cacheManager) : base(cloudRequestBuilder, httpClient, logger, localizationService) { + _cache = cacheManager.GetCache(typeof(string), "UserAgent"); } public override string Name => "FlareSolverr"; @@ -29,6 +33,12 @@ namespace NzbDrone.Core.IndexerProxies.FlareSolverr //Try original request first, ignore errors, detect CF in post response request.SuppressHttpError = true; + //Inject UA if not present + if (_cache.Find(request.Url.Host).IsNotNullOrWhiteSpace() && request.Headers.UserAgent.IsNullOrWhiteSpace()) + { + request.Headers.UserAgent = _cache.Find(request.Url.Host); + } + return request; } @@ -51,18 +61,18 @@ namespace NzbDrone.Core.IndexerProxies.FlareSolverr result = JsonConvert.DeserializeObject(flaresolverrResponse.Content); - var cookieCollection = new CookieCollection(); - var responseHeader = new HttpHeader(); + var newRequest = response.Request; - foreach (var cookie in result.Solution.Cookies) - { - cookieCollection.Add(cookie.ToCookieObj()); - } + //Cache the user-agent so we can inject it in next request to avoid re-solve + _cache.Set(response.Request.Url.Host, result.Solution.UserAgent); + newRequest.Headers.UserAgent = result.Solution.UserAgent; + + InjectCookies(newRequest, result); - //Build new response with FS Cookie and Site Response - var newResponse = new HttpResponse(response.Request, responseHeader, cookieCollection, result.Solution.Response); + //Request again with User-Agent and Cookies from Flaresolvrr + var finalResponse = _httpClient.Execute(newRequest); - return newResponse; + return finalResponse; } private static bool IsCloudflareProtected(HttpResponse response) @@ -79,6 +89,24 @@ namespace NzbDrone.Core.IndexerProxies.FlareSolverr return false; } + private void InjectCookies(HttpRequest request, FlareSolverrResponse flareSolverrResponse) + { + var rCookies = flareSolverrResponse.Solution.Cookies; + + if (!rCookies.Any()) + { + return; + } + + var rCookiesList = rCookies.Select(x => x.Name).ToList(); + + foreach (var rCookie in rCookies) + { + request.Cookies.Remove(rCookie.Name); + request.Cookies.Add(rCookie.Name, rCookie.Value); + } + } + private HttpRequest GenerateFlareSolverrRequest(HttpRequest request) { FlareSolverrRequest req;