public async Task SolveOkProxy()
        {
            var uri          = new Uri("https://www.google.com/");
            var flareSolverr = new FlareSolverr(Settings.FlareSolverrApiUrl)
            {
                ProxyUrl = Settings.ProxyUrl
            };
            var request = new HttpRequestMessage(HttpMethod.Get, uri);

            var flareSolverrResponse = await flareSolverr.Solve(request);

            Assert.AreEqual("ok", flareSolverrResponse.Status);
            Assert.AreEqual("", flareSolverrResponse.Message);
            Assert.IsTrue(flareSolverrResponse.StartTimestamp > 0);
            Assert.IsTrue(flareSolverrResponse.EndTimestamp > flareSolverrResponse.StartTimestamp);
            Assert.IsTrue(flareSolverrResponse.Version.Contains("2."));

            Assert.AreEqual("https://www.google.com/", flareSolverrResponse.Solution.Url);
            Assert.IsTrue(flareSolverrResponse.Solution.Response.Contains("<title>Google</title>"));
            Assert.IsTrue(flareSolverrResponse.Solution.Cookies.Any());
            Assert.IsTrue(flareSolverrResponse.Solution.UserAgent.Contains("Firefox/"));

            var firstCookie = flareSolverrResponse.Solution.Cookies.First();

            Assert.IsTrue(!string.IsNullOrWhiteSpace(firstCookie.Name));
            Assert.IsTrue(!string.IsNullOrWhiteSpace(firstCookie.Value));
        }
        public async Task SolveTestSessions()
        {
            // create new session
            var flareSolverr         = new FlareSolverr(Settings.FlareSolverrApiUrl);
            var flareSolverrResponse = await flareSolverr.CreateSession();

            Assert.AreEqual("ok", flareSolverrResponse.Status);
            Assert.AreEqual("Session created successfully.", flareSolverrResponse.Message);
            Assert.IsTrue(flareSolverrResponse.StartTimestamp > 0);
            Assert.IsTrue(flareSolverrResponse.EndTimestamp > flareSolverrResponse.StartTimestamp);
            Assert.IsTrue(flareSolverrResponse.Version.Contains("2."));
            Assert.IsTrue(flareSolverrResponse.Session.Length > 0);

            // request with session
            var sessionId = flareSolverrResponse.Session;
            var uri       = new Uri("https://www.google.com/");
            var request   = new HttpRequestMessage(HttpMethod.Get, uri);

            flareSolverrResponse = await flareSolverr.Solve(request, sessionId);

            Assert.AreEqual("ok", flareSolverrResponse.Status);
            Assert.AreEqual("200", flareSolverrResponse.Solution.Status);

            // list sessions
            flareSolverrResponse = await flareSolverr.ListSessions();

            Assert.AreEqual("ok", flareSolverrResponse.Status);
            Assert.IsTrue(flareSolverrResponse.Sessions.Contains(sessionId));

            // destroy session
            flareSolverrResponse = await flareSolverr.DestroySession(sessionId);

            Assert.AreEqual("ok", flareSolverrResponse.Status);
        }
Exemple #3
0
        /// <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);
        }
Exemple #4
0
        public async Task SolveOkUserAgent()
        {
            const string userAgent    = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36";
            var          uri          = new Uri("https://www.google.com/");
            var          flareSolverr = new FlareSolverr(Settings.FlareSolverrApiUrl);
            var          request      = new HttpRequestMessage(HttpMethod.Get, uri);

            request.Headers.Add(HttpHeaders.UserAgent, userAgent);

            var flareSolverrResponse = await flareSolverr.Solve(request);

            Assert.AreEqual("ok", flareSolverrResponse.Status);
            Assert.AreEqual(userAgent, flareSolverrResponse.Solution.UserAgent);
        }
        public async Task SolveOkUserAgent()
        {
            const string userAgent    = "Mozilla/5.0 (X11; Linux i686; rv:77.0) Gecko/20100101 Firefox/77.0";
            var          uri          = new Uri("https://www.google.com/");
            var          flareSolverr = new FlareSolverr(Settings.FlareSolverrApiUrl);
            var          request      = new HttpRequestMessage(HttpMethod.Get, uri);

            request.Headers.Add(HttpHeaders.UserAgent, userAgent);

            var flareSolverrResponse = await flareSolverr.Solve(request);

            Assert.AreEqual("ok", flareSolverrResponse.Status);
            Assert.AreEqual(userAgent, flareSolverrResponse.Solution.UserAgent);
        }
Exemple #6
0
        /// <summary>
        /// Creates a new instance of the <see cref="ClearanceHandler"/>.
        /// </summary>
        /// <param name="flareSolverrApiUrl">FlareSolverr API URL. If null or empty it will detect the challenges, but
        /// they will not be solved. Example: "http://localhost:8191/"</param>
        public ClearanceHandler(string flareSolverrApiUrl)
            : base(new HttpClientHandler())
        {
            _client = new HttpClient(new HttpClientHandler
            {
                AllowAutoRedirect      = false,
                AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate,
                CookieContainer        = new CookieContainer()
            });

            if (!string.IsNullOrWhiteSpace(flareSolverrApiUrl))
            {
                _flareSolverr = new FlareSolverr(flareSolverrApiUrl)
                {
                    MaxTimeout = MaxTimeout
                };
            }
        }
Exemple #7
0
        public async Task SolveErrorConfig()
        {
            var uri          = new Uri("https://www.google.com/");
            var flareSolverr = new FlareSolverr("http://localhost:44445");
            var request      = new HttpRequestMessage(HttpMethod.Get, uri);

            try
            {
                await flareSolverr.Solve(request);

                Assert.Fail("Exception not thrown");
            }
            catch (FlareSolverrException e)
            {
                Assert.IsTrue(e.Message.Contains("Error connecting to FlareSolverr server"));
            }
            catch (Exception e)
            {
                Assert.Fail("Unexpected exception: " + e);
            }
        }
Exemple #8
0
        public async Task SolveError()
        {
            var uri          = new Uri("https://www.google.bad1/");
            var flareSolverr = new FlareSolverr(Settings.FlareSolverrApiUrl);
            var request      = new HttpRequestMessage(HttpMethod.Get, uri);

            try
            {
                await flareSolverr.Solve(request);

                Assert.Fail("Exception not thrown");
            }
            catch (FlareSolverrException e)
            {
                Assert.AreEqual("FlareSolverr was unable to process the request, please check FlareSolverr logs. Message: Unable to process browser request. Error: Error: net::ERR_NAME_NOT_RESOLVED at https://www.google.bad1/", e.Message);
            }
            catch (Exception e)
            {
                Assert.Fail("Unexpected exception: " + e);
            }
        }
        public async Task SolveError()
        {
            var uri          = new Uri("https://www.google.bad1/");
            var flareSolverr = new FlareSolverr(Settings.FlareSolverrApiUrl);
            var request      = new HttpRequestMessage(HttpMethod.Get, uri);

            try
            {
                await flareSolverr.Solve(request);

                Assert.Fail("Exception not thrown");
            }
            catch (FlareSolverrException e)
            {
                Assert.AreEqual("NS_ERROR_UNKNOWN_HOST at https://www.google.bad1/", e.Message);
            }
            catch (Exception e)
            {
                Assert.Fail("Unexpected exception: " + e);
            }
        }
        public async Task SolveTestSessions()
        {
            var flareSolverr         = new FlareSolverr(Settings.FlareSolverrApiUrl);
            var flareSolverrResponse = await flareSolverr.CreateSession();

            Assert.AreEqual("ok", flareSolverrResponse.Status);
            Assert.AreEqual("Session created successfully.", flareSolverrResponse.Message);
            Assert.IsTrue(flareSolverrResponse.StartTimestamp > 0);
            Assert.IsTrue(flareSolverrResponse.EndTimestamp > flareSolverrResponse.StartTimestamp);
            Assert.IsTrue(flareSolverrResponse.Version.Contains("2."));

            var sessionID = flareSolverrResponse.Session;

            flareSolverrResponse = await flareSolverr.ListSessions();

            Assert.AreEqual("ok", flareSolverrResponse.Status);
            Assert.IsTrue(flareSolverrResponse.Sessions.Contains(sessionID));

            flareSolverrResponse = await flareSolverr.DestroySession(sessionID);

            Assert.AreEqual("ok", flareSolverrResponse.Status);
        }
        public async Task SolveErrorTimeout()
        {
            var uri          = new Uri("https://www.google.com/");
            var flareSolverr = new FlareSolverr(Settings.FlareSolverrApiUrl)
            {
                MaxTimeout = 100
            };
            var request = new HttpRequestMessage(HttpMethod.Get, uri);

            try
            {
                await flareSolverr.Solve(request);

                Assert.Fail("Exception not thrown");
            }
            catch (FlareSolverrException e)
            {
                Assert.IsTrue(e.Message.Contains("FlareSolverr was unable to process the request, please check FlareSolverr logs. Message: Error: Unable to process browser request. Error: Maximum timeout reached. maxTimeout=100 (ms)"));
            }
            catch (Exception e)
            {
                Assert.Fail("Unexpected exception: " + e);
            }
        }
        public async Task SolveErrorProxy()
        {
            var uri          = new Uri("https://www.google.com/");
            var flareSolverr = new FlareSolverr(Settings.FlareSolverrApiUrl)
            {
                ProxyUrl = "http://localhost:44445"
            };
            var request = new HttpRequestMessage(HttpMethod.Get, uri);

            try
            {
                await flareSolverr.Solve(request);

                Assert.Fail("Exception not thrown");
            }
            catch (FlareSolverrException e)
            {
                Assert.IsTrue(e.Message.Contains("FlareSolverr was unable to process the request, please check FlareSolverr logs. Message: Error: Unable to process browser request. Error: NS_ERROR_PROXY_CONNECTION_REFUSED at https://www.google.com/"));
            }
            catch (Exception e)
            {
                Assert.Fail("Unexpected exception: " + e);
            }
        }