/// <summary> /// Sends an HTTP request to the inner handler to send to the server as an asynchronous operation. /// </summary> /// <param name="request">The HTTP request message to send to the server.</param> /// <param name="cancellationToken">A cancellation token to cancel operation.</param> /// <returns>The task object representing the asynchronous operation.</returns> protected override async Task <HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { // Change the User-Agent if required OverrideUserAgentHeader(request); // Perform the original user request var response = await base.SendAsync(request, cancellationToken).ConfigureAwait(false); // Detect if there is a challenge in the response if (ChallengeDetector.IsClearanceRequired(response)) { if (_flareSolverr == null) { throw new FlareSolverrException("Challenge detected but FlareSolverr is not configured"); } // Resolve the challenge using FlareSolverr API var flareSolverrResponse = await _flareSolverr.Solve(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); } return(response); }
/// <summary> /// Sends an HTTP request to the inner handler to send to the server as an asynchronous operation. /// </summary> /// <param name="request">The HTTP request message to send to the server.</param> /// <param name="cancellationToken">A cancellation token to cancel operation.</param> /// <returns>The task object representing the asynchronous operation.</returns> protected override async Task <HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { // Init FlareSolverr if (_flareSolverr == null && !string.IsNullOrWhiteSpace(_flareSolverrApiUrl)) { _flareSolverr = new FlareSolverr(_flareSolverrApiUrl) { MaxTimeout = MaxTimeout, ProxyUrl = ProxyUrl }; } // Set the User-Agent if required SetUserAgentHeader(request); // Perform the original user request var response = await base.SendAsync(request, cancellationToken).ConfigureAwait(false); // Detect if there is a challenge in the response if (ChallengeDetector.IsClearanceRequired(response)) { if (_flareSolverr == null) { throw new FlareSolverrException("Challenge detected but FlareSolverr is not configured"); } // Resolve the challenge using FlareSolverr API var 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())) { _userAgent = flareSolverUserAgent; // 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); } return(response); }