15
15
using FlareSolverrSharp . Solvers ;
16
16
using FlareSolverrSharp . Types ;
17
17
using Cookie = System . Net . Cookie ;
18
+
18
19
// ReSharper disable InconsistentNaming
19
20
20
21
// ReSharper disable InvalidXmlDocComment
@@ -43,16 +44,18 @@ public class ClearanceHandler : DelegatingHandler
43
44
44
45
public bool CookieCapacity { get ; set ; }
45
46
47
+ private readonly IFlaresolverrResponseStorage _responseStorage ;
48
+
46
49
/// <summary>
47
50
/// Creates a new instance of the <see cref="ClearanceHandler"/>.
48
51
/// </summary>
49
52
/// <param name="flareSolverrApiUrl">FlareSolverr API URL. If null or empty it will detect the challenges, but
50
53
/// they will not be solved. Example: "http://localhost:8191/"</param>
51
- public ClearanceHandler ( string api )
52
- : this ( new FlareSolverr ( api ) ) { }
54
+ public ClearanceHandler ( string api )
55
+ : this ( new FlareSolverr ( api ) , new DefaultFlaresolverrResponseStorage ( ) ) { }
53
56
54
-
55
- public ClearanceHandler ( FlareSolverr solverr )
57
+
58
+ public ClearanceHandler ( FlareSolverr solverr , IFlaresolverrResponseStorage storage )
56
59
: base ( new HttpClientHandler ( ) )
57
60
{
58
61
m_client = new HttpClient ( new HttpClientHandler
@@ -63,7 +66,8 @@ public ClearanceHandler(FlareSolverr solverr)
63
66
} ) ;
64
67
65
68
66
- Solverr = solverr ;
69
+ Solverr = solverr ;
70
+ _responseStorage = storage ;
67
71
}
68
72
69
73
/// <summary>
@@ -87,6 +91,7 @@ protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage
87
91
var response = await base . SendAsync ( request , cancellationToken ) . ConfigureAwait ( false ) ;
88
92
89
93
// Detect if there is a challenge in the response
94
+ /*
90
95
if (ChallengeDetector.IsClearanceRequiredAsync(response)) {
91
96
92
97
// Resolve the challenge using FlareSolverr API
@@ -111,13 +116,67 @@ protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage
111
116
if (EnsureResponseIntegrity) {
112
117
113
118
if (ChallengeDetector.IsClearanceRequiredAsync(response)) {
114
- // throw new FlareSolverrException("The cookies provided by FlareSolverr are not valid");
119
+ throw new FlareSolverrException("The cookies provided by FlareSolverr are not valid");
115
120
}
116
121
}
117
122
118
123
// Add the "Set-Cookie" header in the response with the cookies provided by FlareSolverr
119
124
InjectSetCookieHeader(response, flareSolverrResponse);
120
125
}
126
+ */
127
+ if ( ! ChallengeDetector . IsClearanceRequiredAsync ( response ) ) {
128
+
129
+ return response ;
130
+ }
131
+
132
+ var flareSolverrResponse = await _responseStorage . LoadAsync ( ) ;
133
+
134
+ if ( flareSolverrResponse != null ) {
135
+ // Set user agent
136
+ if ( flareSolverrResponse . Solution . UserAgent != null
137
+ && flareSolverrResponse . Solution . UserAgent != ( request . Headers . UserAgent . ToString ( ) ) ) {
138
+ // Set the User-Agent if required
139
+ m_userAgent = flareSolverrResponse . Solution . UserAgent ;
140
+ SetUserAgentHeader ( request ) ;
141
+ }
142
+
143
+ // Retry request with saved response
144
+ InjectCookies ( request , flareSolverrResponse ) ;
145
+ response = await base . SendAsync ( request , cancellationToken ) . ConfigureAwait ( false ) ;
146
+
147
+ if ( ! ChallengeDetector . IsClearanceRequiredAsync ( response ) ) {
148
+ // Success with saved response
149
+ InjectSetCookieHeader ( response , flareSolverrResponse ) ;
150
+ return response ;
151
+ }
152
+ }
153
+
154
+ // Resolve the challenge using FlareSolverr API
155
+ flareSolverrResponse = await Solverr . SolveAsync ( request ) ;
156
+
157
+ // Save the FlareSolverr User-Agent for the following requests
158
+ var flareSolverUserAgent = flareSolverrResponse . Solution . UserAgent ;
159
+
160
+ if ( flareSolverUserAgent != null && ! flareSolverUserAgent . Equals ( request . Headers . UserAgent . ToString ( ) ) )
161
+ {
162
+ m_userAgent = flareSolverUserAgent ;
163
+
164
+ // Set the User-Agent if required
165
+ SetUserAgentHeader ( request ) ;
166
+ }
167
+
168
+ // Change the cookies in the original request with the cookies provided by FlareSolverr
169
+ InjectCookies ( request , flareSolverrResponse ) ;
170
+ response = await base . SendAsync ( request , cancellationToken ) . ConfigureAwait ( false ) ;
171
+
172
+ // Detect if there is a challenge in the response
173
+ if ( EnsureResponseIntegrity && ChallengeDetector . IsClearanceRequiredAsync ( response ) ) {
174
+ throw new FlareSolverrException ( "The cookies provided by FlareSolverr are not valid" ) ;
175
+ }
176
+
177
+ // Add the "Set-Cookie" header in the response with the cookies provided by FlareSolverr
178
+ InjectSetCookieHeader ( response , flareSolverrResponse ) ;
179
+ await _responseStorage . SaveAsync ( flareSolverrResponse ) ;
121
180
122
181
return response ;
123
182
}
0 commit comments