Fixed: (Flaresolverr) YggCookie and YggTorrent Issues

pull/679/head
Qstick 3 years ago
parent 4eadd4cb2f
commit 0f52258d53

@ -254,7 +254,8 @@ namespace NzbDrone.Common.Http.Dispatchers
webRequest.TransferEncoding = header.Value; webRequest.TransferEncoding = header.Value;
break; break;
case "User-Agent": case "User-Agent":
throw new NotSupportedException("User-Agent other than Prowlarr not allowed."); webRequest.UserAgent = header.Value;
break;
case "Proxy-Connection": case "Proxy-Connection":
throw new NotImplementedException(); throw new NotImplementedException();
default: default:

@ -1,4 +1,4 @@
using System; using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.Specialized; 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 public string Accept
{ {
get get

@ -5,7 +5,9 @@ using System.Net;
using FluentValidation.Results; using FluentValidation.Results;
using Newtonsoft.Json; using Newtonsoft.Json;
using NLog; using NLog;
using NzbDrone.Common.Cache;
using NzbDrone.Common.Cloud; using NzbDrone.Common.Cloud;
using NzbDrone.Common.Extensions;
using NzbDrone.Common.Http; using NzbDrone.Common.Http;
using NzbDrone.Common.Serializer; using NzbDrone.Common.Serializer;
using NzbDrone.Core.Localization; using NzbDrone.Core.Localization;
@ -16,10 +18,12 @@ namespace NzbDrone.Core.IndexerProxies.FlareSolverr
public class FlareSolverr : HttpIndexerProxyBase<FlareSolverrSettings> public class FlareSolverr : HttpIndexerProxyBase<FlareSolverrSettings>
{ {
private static readonly HashSet<string> CloudflareServerNames = new HashSet<string> { "cloudflare", "cloudflare-nginx" }; private static readonly HashSet<string> CloudflareServerNames = new HashSet<string> { "cloudflare", "cloudflare-nginx" };
private readonly ICached<string> _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) : base(cloudRequestBuilder, httpClient, logger, localizationService)
{ {
_cache = cacheManager.GetCache<string>(typeof(string), "UserAgent");
} }
public override string Name => "FlareSolverr"; 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 //Try original request first, ignore errors, detect CF in post response
request.SuppressHttpError = true; 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; return request;
} }
@ -51,18 +61,18 @@ namespace NzbDrone.Core.IndexerProxies.FlareSolverr
result = JsonConvert.DeserializeObject<FlareSolverrResponse>(flaresolverrResponse.Content); result = JsonConvert.DeserializeObject<FlareSolverrResponse>(flaresolverrResponse.Content);
var cookieCollection = new CookieCollection(); var newRequest = response.Request;
var responseHeader = new HttpHeader();
foreach (var cookie in result.Solution.Cookies) //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);
cookieCollection.Add(cookie.ToCookieObj()); newRequest.Headers.UserAgent = result.Solution.UserAgent;
}
InjectCookies(newRequest, result);
//Build new response with FS Cookie and Site Response //Request again with User-Agent and Cookies from Flaresolvrr
var newResponse = new HttpResponse(response.Request, responseHeader, cookieCollection, result.Solution.Response); var finalResponse = _httpClient.Execute(newRequest);
return newResponse; return finalResponse;
} }
private static bool IsCloudflareProtected(HttpResponse response) private static bool IsCloudflareProtected(HttpResponse response)
@ -79,6 +89,24 @@ namespace NzbDrone.Core.IndexerProxies.FlareSolverr
return false; 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) private HttpRequest GenerateFlareSolverrRequest(HttpRequest request)
{ {
FlareSolverrRequest req; FlareSolverrRequest req;

Loading…
Cancel
Save