From d4db47311d023a8a5f4b697eb016c8982dcc7c32 Mon Sep 17 00:00:00 2001 From: Ivan Kara Date: Thu, 29 Jun 2023 14:33:36 +0700 Subject: [PATCH 1/6] Added flaresolverr response storage --- src/FlareSolverrSharp/ClearanceHandler.cs | 83 +++++++++++++++---- .../FlaresolverrResponseStorage.cs | 24 ++++++ 2 files changed, 91 insertions(+), 16 deletions(-) create mode 100644 src/FlareSolverrSharp/FlaresolverrResponseStorage.cs diff --git a/src/FlareSolverrSharp/ClearanceHandler.cs b/src/FlareSolverrSharp/ClearanceHandler.cs index e166383..62a2c43 100644 --- a/src/FlareSolverrSharp/ClearanceHandler.cs +++ b/src/FlareSolverrSharp/ClearanceHandler.cs @@ -20,6 +20,7 @@ public class ClearanceHandler : DelegatingHandler { private readonly HttpClient _client; private readonly string _flareSolverrApiUrl; + private readonly IFlaresolverrResponseStorage _responseStorage; private FlareSolverr _flareSolverr; private string _userAgent; @@ -42,6 +43,17 @@ public class ClearanceHandler : DelegatingHandler /// FlareSolverr API URL. If null or empty it will detect the challenges, but /// they will not be solved. Example: "http://localhost:8191/" public ClearanceHandler(string flareSolverrApiUrl) + : this(flareSolverrApiUrl, new DefaultFlaresolverrResponseStorage()) + { + } + + /// + /// Creates a new instance of the . + /// + /// FlareSolverr API URL. If null or empty it will detect the challenges, but + /// they will not be solved. Example: "http://localhost:8191/" + /// Storage to persist challenge responses. + public ClearanceHandler(string flareSolverrApiUrl, IFlaresolverrResponseStorage responseStorage) : base(new HttpClientHandler()) { // Validate URI @@ -50,6 +62,7 @@ public ClearanceHandler(string flareSolverrApiUrl) throw new FlareSolverrException("FlareSolverr URL is malformed: " + flareSolverrApiUrl); _flareSolverrApiUrl = flareSolverrApiUrl; + _responseStorage = responseStorage; _client = new HttpClient(new HttpClientHandler { @@ -84,34 +97,72 @@ protected override async Task SendAsync(HttpRequestMessage var response = await base.SendAsync(request, cancellationToken).ConfigureAwait(false); // Detect if there is a challenge in the response - if (ChallengeDetector.IsClearanceRequired(response)) + if (!ChallengeDetector.IsClearanceRequired(response)) { - if (_flareSolverr == null) - throw new FlareSolverrException("Challenge detected but FlareSolverr is not configured"); + return response; + } - // Resolve the challenge using FlareSolverr API - var flareSolverrResponse = await _flareSolverr.Solve(request); + if (_flareSolverr == null) + throw new FlareSolverrException("Challenge detected but FlareSolverr is not configured"); + + // Check if saved response exists. + var flareSolverrResponse = await _responseStorage.LoadAsync(); + bool isNewResponse = true; - // Save the FlareSolverr User-Agent for the following requests - var flareSolverUserAgent = flareSolverrResponse.Solution.UserAgent; - if (flareSolverUserAgent != null && !flareSolverUserAgent.Equals(request.Headers.UserAgent.ToString())) + if (flareSolverrResponse == null) + { + // Resolve the challenge using FlareSolverr API + flareSolverrResponse = await _flareSolverr.Solve(request); + } + else + { + // Set user agent + if (flareSolverrResponse.Solution.UserAgent != null && + !flareSolverrResponse.Solution.UserAgent.Equals(request.Headers.UserAgent.ToString())) { - _userAgent = flareSolverUserAgent; - - // Set the User-Agent if required + _userAgent = flareSolverrResponse.Solution.UserAgent; SetUserAgentHeader(request); } - // Change the cookies in the original request with the cookies provided by FlareSolverr + // Retry request with saved response InjectCookies(request, flareSolverrResponse); response = await base.SendAsync(request, cancellationToken).ConfigureAwait(false); - // Detect if there is a challenge in the response if (ChallengeDetector.IsClearanceRequired(response)) - throw new FlareSolverrException("The cookies provided by FlareSolverr are not valid"); + { + // Resolve the challenge using FlareSolverr API + flareSolverrResponse = await _flareSolverr.Solve(request); + } + else + { + isNewResponse = false; + } + } + + // Save the FlareSolverr User-Agent for the following requests + var flareSolverUserAgent = flareSolverrResponse.Solution.UserAgent; + if (flareSolverUserAgent != null && !flareSolverUserAgent.Equals(request.Headers.UserAgent.ToString())) + { + _userAgent = flareSolverUserAgent; - // Add the "Set-Cookie" header in the response with the cookies provided by FlareSolverr - InjectSetCookieHeader(response, flareSolverrResponse); + // Set the User-Agent if required + SetUserAgentHeader(request); + } + + // Change the cookies in the original request with the cookies provided by FlareSolverr + InjectCookies(request, flareSolverrResponse); + response = await base.SendAsync(request, cancellationToken).ConfigureAwait(false); + + // Detect if there is a challenge in the response + if (ChallengeDetector.IsClearanceRequired(response)) + throw new FlareSolverrException("The cookies provided by FlareSolverr are not valid"); + + // Add the "Set-Cookie" header in the response with the cookies provided by FlareSolverr + InjectSetCookieHeader(response, flareSolverrResponse); + + if (isNewResponse) + { + await _responseStorage.SaveAsync(flareSolverrResponse); } return response; diff --git a/src/FlareSolverrSharp/FlaresolverrResponseStorage.cs b/src/FlareSolverrSharp/FlaresolverrResponseStorage.cs new file mode 100644 index 0000000..90703c2 --- /dev/null +++ b/src/FlareSolverrSharp/FlaresolverrResponseStorage.cs @@ -0,0 +1,24 @@ +using System.Threading.Tasks; +using FlareSolverrSharp.Types; + +namespace FlareSolverrSharp +{ + public interface IFlaresolverrResponseStorage + { + Task SaveAsync(FlareSolverrResponse result); + Task LoadAsync(); + } + + public class DefaultFlaresolverrResponseStorage : IFlaresolverrResponseStorage + { + public Task LoadAsync() + { + return Task.FromResult(null); + } + + public Task SaveAsync(FlareSolverrResponse result) + { + return Task.CompletedTask; + } + } +} From f36f04d07c199270c8f0634cb9b850eed5d967ca Mon Sep 17 00:00:00 2001 From: Ivan Kara Date: Thu, 29 Jun 2023 14:50:57 +0700 Subject: [PATCH 2/6] Replaced newtonsoft.json with STJ --- src/FlareSolverrSharp/FlareSolverrSharp.csproj | 4 ++-- src/FlareSolverrSharp/Solvers/FlareSolverr.cs | 13 +++++++------ .../Solvers/FlareSolverrContext.cs | 12 ++++++++++++ src/FlareSolverrSharp/Types/FlareSolverrRequest.cs | 10 +++++----- .../Types/FlareSolverrRequestGet.cs | 4 ++-- .../Types/FlareSolverrRequestPost.cs | 6 +++--- .../Types/FlareSolverrRequestProxy.cs | 4 ++-- src/FlareSolverrSharp/Types/FlareSolverrResponse.cs | 4 ++-- 8 files changed, 35 insertions(+), 22 deletions(-) create mode 100644 src/FlareSolverrSharp/Solvers/FlareSolverrContext.cs diff --git a/src/FlareSolverrSharp/FlareSolverrSharp.csproj b/src/FlareSolverrSharp/FlareSolverrSharp.csproj index c51af3f..76c6fae 100644 --- a/src/FlareSolverrSharp/FlareSolverrSharp.csproj +++ b/src/FlareSolverrSharp/FlareSolverrSharp.csproj @@ -1,7 +1,7 @@  - netstandard1.3 + netstandard2.0 FlareSolverrSharp FlareSolverrSharp 3.0.5 @@ -16,7 +16,7 @@ - + diff --git a/src/FlareSolverrSharp/Solvers/FlareSolverr.cs b/src/FlareSolverrSharp/Solvers/FlareSolverr.cs index f4e6628..3716ecb 100644 --- a/src/FlareSolverrSharp/Solvers/FlareSolverr.cs +++ b/src/FlareSolverrSharp/Solvers/FlareSolverr.cs @@ -2,11 +2,11 @@ using System.Net; using System.Net.Http; using System.Text; +using System.Text.Json; using System.Threading.Tasks; using FlareSolverrSharp.Exceptions; using FlareSolverrSharp.Types; using FlareSolverrSharp.Utilities; -using Newtonsoft.Json; namespace FlareSolverrSharp.Solvers { @@ -102,7 +102,9 @@ await Locker.LockAsync(async () => var resContent = await response.Content.ReadAsStringAsync(); try { - result = JsonConvert.DeserializeObject(resContent); + result = JsonSerializer.Deserialize( + resContent, + FlareSolverrContext.Default.FlareSolverrResponse); } catch (Exception) { @@ -160,10 +162,9 @@ private FlareSolverrRequestProxy GetProxy() private HttpContent GetSolverRequestContent(FlareSolverrRequest request) { - var payload = JsonConvert.SerializeObject(request, new JsonSerializerSettings - { - NullValueHandling = NullValueHandling.Ignore - }); + var payload = JsonSerializer.Serialize( + request, + FlareSolverrContext.Default.FlareSolverrRequest); HttpContent content = new StringContent(payload, Encoding.UTF8, "application/json"); return content; } diff --git a/src/FlareSolverrSharp/Solvers/FlareSolverrContext.cs b/src/FlareSolverrSharp/Solvers/FlareSolverrContext.cs new file mode 100644 index 0000000..d798168 --- /dev/null +++ b/src/FlareSolverrSharp/Solvers/FlareSolverrContext.cs @@ -0,0 +1,12 @@ +using System.Text.Json.Serialization; +using FlareSolverrSharp.Types; + +namespace FlareSolverrSharp.Solvers +{ + [JsonSerializable(typeof(FlareSolverrRequest))] + [JsonSerializable(typeof(FlareSolverrResponse))] + [JsonSourceGenerationOptions(DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull)] + public partial class FlareSolverrContext : JsonSerializerContext + { + } +} \ No newline at end of file diff --git a/src/FlareSolverrSharp/Types/FlareSolverrRequest.cs b/src/FlareSolverrSharp/Types/FlareSolverrRequest.cs index 49bd18b..6cb8863 100644 --- a/src/FlareSolverrSharp/Types/FlareSolverrRequest.cs +++ b/src/FlareSolverrSharp/Types/FlareSolverrRequest.cs @@ -1,19 +1,19 @@ -using Newtonsoft.Json; +using System.Text.Json.Serialization; namespace FlareSolverrSharp.Types { public class FlareSolverrRequest { - [JsonProperty("cmd")] + [JsonPropertyName("cmd")] public string Cmd; - [JsonProperty("url")] + [JsonPropertyName("url")] public string Url; - [JsonProperty("session")] + [JsonPropertyName("session")] public string Session; - [JsonProperty("proxy")] + [JsonPropertyName("proxy")] public FlareSolverrRequestProxy Proxy; } } diff --git a/src/FlareSolverrSharp/Types/FlareSolverrRequestGet.cs b/src/FlareSolverrSharp/Types/FlareSolverrRequestGet.cs index 41b520b..1610e87 100644 --- a/src/FlareSolverrSharp/Types/FlareSolverrRequestGet.cs +++ b/src/FlareSolverrSharp/Types/FlareSolverrRequestGet.cs @@ -1,10 +1,10 @@ -using Newtonsoft.Json; +using System.Text.Json.Serialization; namespace FlareSolverrSharp.Types { public class FlareSolverrRequestGet : FlareSolverrRequest { - [JsonProperty("maxTimeout")] + [JsonPropertyName("maxTimeout")] public int MaxTimeout; } } \ No newline at end of file diff --git a/src/FlareSolverrSharp/Types/FlareSolverrRequestPost.cs b/src/FlareSolverrSharp/Types/FlareSolverrRequestPost.cs index 932c5f1..c9862c5 100644 --- a/src/FlareSolverrSharp/Types/FlareSolverrRequestPost.cs +++ b/src/FlareSolverrSharp/Types/FlareSolverrRequestPost.cs @@ -1,13 +1,13 @@ -using Newtonsoft.Json; +using System.Text.Json.Serialization; namespace FlareSolverrSharp.Types { public class FlareSolverrRequestPost : FlareSolverrRequest { - [JsonProperty("postData")] + [JsonPropertyName("postData")] public string PostData; - [JsonProperty("maxTimeout")] + [JsonPropertyName("maxTimeout")] public int MaxTimeout; } } \ No newline at end of file diff --git a/src/FlareSolverrSharp/Types/FlareSolverrRequestProxy.cs b/src/FlareSolverrSharp/Types/FlareSolverrRequestProxy.cs index d8e3135..35df5ec 100644 --- a/src/FlareSolverrSharp/Types/FlareSolverrRequestProxy.cs +++ b/src/FlareSolverrSharp/Types/FlareSolverrRequestProxy.cs @@ -1,10 +1,10 @@ -using Newtonsoft.Json; +using System.Text.Json.Serialization; namespace FlareSolverrSharp.Types { public class FlareSolverrRequestProxy { - [JsonProperty("url")] + [JsonPropertyName("url")] public string Url; } } diff --git a/src/FlareSolverrSharp/Types/FlareSolverrResponse.cs b/src/FlareSolverrSharp/Types/FlareSolverrResponse.cs index e852ef7..4cd8915 100644 --- a/src/FlareSolverrSharp/Types/FlareSolverrResponse.cs +++ b/src/FlareSolverrSharp/Types/FlareSolverrResponse.cs @@ -1,4 +1,4 @@ -using Newtonsoft.Json; +using System.Text.Json.Serialization; // ReSharper disable UnusedMember.Global // ReSharper disable UnassignedField.Global @@ -49,7 +49,7 @@ public class Headers { public string Status; public string Date; - [JsonProperty(PropertyName = "content-type")] + [JsonPropertyName("content-type")] public string ContentType; } } \ No newline at end of file From a9462d73dfb3b8267caa69cb9502a9ba5137f648 Mon Sep 17 00:00:00 2001 From: Ivan Kara Date: Thu, 29 Jun 2023 15:18:28 +0700 Subject: [PATCH 3/6] Added nullable; Changed language version to latest; --- src/FlareSolverrSharp/FlareSolverrSharp.csproj | 2 ++ src/FlareSolverrSharp/FlaresolverrResponseStorage.cs | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/FlareSolverrSharp/FlareSolverrSharp.csproj b/src/FlareSolverrSharp/FlareSolverrSharp.csproj index 76c6fae..8f98d59 100644 --- a/src/FlareSolverrSharp/FlareSolverrSharp.csproj +++ b/src/FlareSolverrSharp/FlareSolverrSharp.csproj @@ -2,6 +2,8 @@ netstandard2.0 + latest + enable FlareSolverrSharp FlareSolverrSharp 3.0.5 diff --git a/src/FlareSolverrSharp/FlaresolverrResponseStorage.cs b/src/FlareSolverrSharp/FlaresolverrResponseStorage.cs index 90703c2..1850222 100644 --- a/src/FlareSolverrSharp/FlaresolverrResponseStorage.cs +++ b/src/FlareSolverrSharp/FlaresolverrResponseStorage.cs @@ -6,14 +6,14 @@ namespace FlareSolverrSharp public interface IFlaresolverrResponseStorage { Task SaveAsync(FlareSolverrResponse result); - Task LoadAsync(); + Task LoadAsync(); } public class DefaultFlaresolverrResponseStorage : IFlaresolverrResponseStorage { - public Task LoadAsync() + public Task LoadAsync() { - return Task.FromResult(null); + return Task.FromResult(null); } public Task SaveAsync(FlareSolverrResponse result) From e7c592a7ddebf2182a240222a0a5717bbbbb152e Mon Sep 17 00:00:00 2001 From: Ivan Kara Date: Thu, 29 Jun 2023 15:27:09 +0700 Subject: [PATCH 4/6] Fixed json derived types serialization --- src/FlareSolverrSharp/Types/FlareSolverrRequest.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/FlareSolverrSharp/Types/FlareSolverrRequest.cs b/src/FlareSolverrSharp/Types/FlareSolverrRequest.cs index 6cb8863..06f23e6 100644 --- a/src/FlareSolverrSharp/Types/FlareSolverrRequest.cs +++ b/src/FlareSolverrSharp/Types/FlareSolverrRequest.cs @@ -2,6 +2,8 @@ namespace FlareSolverrSharp.Types { + [JsonDerivedType(typeof(FlareSolverrRequestGet))] + [JsonDerivedType(typeof(FlareSolverrRequestPost))] public class FlareSolverrRequest { [JsonPropertyName("cmd")] From 7438ac84dc25595daa13b0bbb4c63df11bac4315 Mon Sep 17 00:00:00 2001 From: Ivan Kara Date: Thu, 29 Jun 2023 16:13:45 +0700 Subject: [PATCH 5/6] Fixed empty serializer result --- .../Types/FlareSolverrRequest.cs | 8 +- .../Types/FlareSolverrRequestGet.cs | 2 +- .../Types/FlareSolverrRequestPost.cs | 4 +- .../Types/FlareSolverrRequestProxy.cs | 2 +- .../Types/FlareSolverrResponse.cs | 97 +++++++++++++------ 5 files changed, 78 insertions(+), 35 deletions(-) diff --git a/src/FlareSolverrSharp/Types/FlareSolverrRequest.cs b/src/FlareSolverrSharp/Types/FlareSolverrRequest.cs index 06f23e6..a292382 100644 --- a/src/FlareSolverrSharp/Types/FlareSolverrRequest.cs +++ b/src/FlareSolverrSharp/Types/FlareSolverrRequest.cs @@ -7,15 +7,15 @@ namespace FlareSolverrSharp.Types public class FlareSolverrRequest { [JsonPropertyName("cmd")] - public string Cmd; + public string Cmd { get; set; } [JsonPropertyName("url")] - public string Url; + public string Url { get; set; } [JsonPropertyName("session")] - public string Session; + public string Session { get; set; } [JsonPropertyName("proxy")] - public FlareSolverrRequestProxy Proxy; + public FlareSolverrRequestProxy Proxy { get; set; } } } diff --git a/src/FlareSolverrSharp/Types/FlareSolverrRequestGet.cs b/src/FlareSolverrSharp/Types/FlareSolverrRequestGet.cs index 1610e87..b73d33c 100644 --- a/src/FlareSolverrSharp/Types/FlareSolverrRequestGet.cs +++ b/src/FlareSolverrSharp/Types/FlareSolverrRequestGet.cs @@ -5,6 +5,6 @@ namespace FlareSolverrSharp.Types public class FlareSolverrRequestGet : FlareSolverrRequest { [JsonPropertyName("maxTimeout")] - public int MaxTimeout; + public int MaxTimeout { get; set; } } } \ No newline at end of file diff --git a/src/FlareSolverrSharp/Types/FlareSolverrRequestPost.cs b/src/FlareSolverrSharp/Types/FlareSolverrRequestPost.cs index c9862c5..b64cd20 100644 --- a/src/FlareSolverrSharp/Types/FlareSolverrRequestPost.cs +++ b/src/FlareSolverrSharp/Types/FlareSolverrRequestPost.cs @@ -5,9 +5,9 @@ namespace FlareSolverrSharp.Types public class FlareSolverrRequestPost : FlareSolverrRequest { [JsonPropertyName("postData")] - public string PostData; + public string PostData { get; set; } [JsonPropertyName("maxTimeout")] - public int MaxTimeout; + public int MaxTimeout { get; set; } } } \ No newline at end of file diff --git a/src/FlareSolverrSharp/Types/FlareSolverrRequestProxy.cs b/src/FlareSolverrSharp/Types/FlareSolverrRequestProxy.cs index 35df5ec..8dde077 100644 --- a/src/FlareSolverrSharp/Types/FlareSolverrRequestProxy.cs +++ b/src/FlareSolverrSharp/Types/FlareSolverrRequestProxy.cs @@ -5,6 +5,6 @@ namespace FlareSolverrSharp.Types public class FlareSolverrRequestProxy { [JsonPropertyName("url")] - public string Url; + public string Url { get; set; } } } diff --git a/src/FlareSolverrSharp/Types/FlareSolverrResponse.cs b/src/FlareSolverrSharp/Types/FlareSolverrResponse.cs index 4cd8915..8a2a3ce 100644 --- a/src/FlareSolverrSharp/Types/FlareSolverrResponse.cs +++ b/src/FlareSolverrSharp/Types/FlareSolverrResponse.cs @@ -7,38 +7,77 @@ namespace FlareSolverrSharp.Types { public class FlareSolverrResponse { - public string Status; - public string Message; - public long StartTimestamp; - public long EndTimestamp; - public string Version; - public Solution Solution; - public string Session; - public string[] Sessions; + [JsonPropertyName("status")] + public string Status { get; set; } + + [JsonPropertyName("message")] + public string Message { get; set; } + + [JsonPropertyName("startTimestamp")] + public long StartTimestamp { get; set; } + + [JsonPropertyName("endTimestamp")] + public long EndTimestamp { get; set; } + + [JsonPropertyName("version")] + public string Version { get; set; } + + [JsonPropertyName("solution")] + public Solution Solution { get; set; } } public class Solution { - public string Url; - public string Status; - public Headers Headers; - public string Response; - public Cookie[] Cookies; - public string UserAgent; + [JsonPropertyName("url")] + public string Url { get; set; } + + [JsonPropertyName("status")] + public int Status { get; set; } + + [JsonPropertyName("headers")] + public Headers Headers { get; set; } + + [JsonPropertyName("response")] + public string Response { get; set; } + + [JsonPropertyName("cookies")] + public Cookie[] Cookies { get; set; } + + [JsonPropertyName("userAgent")] + public string UserAgent { get; set; } } public class Cookie { - public string Name; - public string Value; - public string Domain; - public string Path; - public double Expires; - public int Size; - public bool HttpOnly; - public bool Secure; - public bool Session; - public string SameSite; + [JsonPropertyName("name")] + public string Name { get; set; } + + [JsonPropertyName("value")] + public string Value { get; set; } + + [JsonPropertyName("domain")] + public string Domain { get; set; } + + [JsonPropertyName("path")] + public string Path { get; set; } + + [JsonPropertyName("expiry")] + public double Expires { get; set; } + + [JsonPropertyName("size")] + public int Size { get; set; } + + [JsonPropertyName("httpOnly")] + public bool HttpOnly { get; set; } + + [JsonPropertyName("secure")] + public bool Secure { get; set; } + + [JsonPropertyName("session")] + public bool Session { get; set; } + + [JsonPropertyName("sameSite")] + public string SameSite { get; set; } public string ToHeaderValue() => $"{Name}={Value}"; public System.Net.Cookie ToCookieObj() => new System.Net.Cookie(Name, Value); @@ -47,9 +86,13 @@ public class Cookie public class Headers { - public string Status; - public string Date; + [JsonPropertyName("status")] + public string Status { get; set; } + + [JsonPropertyName("date")] + public string Date { get; set; } + [JsonPropertyName("content-type")] - public string ContentType; + public string ContentType { get; set; } } } \ No newline at end of file From 02c9fb012293d3802e09c526665e0ab2a8294986 Mon Sep 17 00:00:00 2001 From: Ivan Kara Date: Thu, 29 Jun 2023 16:19:30 +0700 Subject: [PATCH 6/6] Better code --- src/FlareSolverrSharp/ClearanceHandler.cs | 28 ++++++++--------------- 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/src/FlareSolverrSharp/ClearanceHandler.cs b/src/FlareSolverrSharp/ClearanceHandler.cs index 62a2c43..a1e37f8 100644 --- a/src/FlareSolverrSharp/ClearanceHandler.cs +++ b/src/FlareSolverrSharp/ClearanceHandler.cs @@ -107,14 +107,8 @@ protected override async Task SendAsync(HttpRequestMessage // Check if saved response exists. var flareSolverrResponse = await _responseStorage.LoadAsync(); - bool isNewResponse = true; - if (flareSolverrResponse == null) - { - // Resolve the challenge using FlareSolverr API - flareSolverrResponse = await _flareSolverr.Solve(request); - } - else + if (flareSolverrResponse != null) { // Set user agent if (flareSolverrResponse.Solution.UserAgent != null && @@ -128,17 +122,17 @@ protected override async Task SendAsync(HttpRequestMessage InjectCookies(request, flareSolverrResponse); response = await base.SendAsync(request, cancellationToken).ConfigureAwait(false); - if (ChallengeDetector.IsClearanceRequired(response)) - { - // Resolve the challenge using FlareSolverr API - flareSolverrResponse = await _flareSolverr.Solve(request); - } - else + if (!ChallengeDetector.IsClearanceRequired(response)) { - isNewResponse = false; + // Success with saved response. + InjectSetCookieHeader(response, flareSolverrResponse); + return response; } } + // Resolve the challenge using FlareSolverr API + flareSolverrResponse = await _flareSolverr.Solve(request); + // Save the FlareSolverr User-Agent for the following requests var flareSolverUserAgent = flareSolverrResponse.Solution.UserAgent; if (flareSolverUserAgent != null && !flareSolverUserAgent.Equals(request.Headers.UserAgent.ToString())) @@ -159,11 +153,7 @@ protected override async Task SendAsync(HttpRequestMessage // Add the "Set-Cookie" header in the response with the cookies provided by FlareSolverr InjectSetCookieHeader(response, flareSolverrResponse); - - if (isNewResponse) - { - await _responseStorage.SaveAsync(flareSolverrResponse); - } + await _responseStorage.SaveAsync(flareSolverrResponse); return response; }