Example #1
0
        /// <summary>
        /// If options are None then the selected proxy is not validated.
        /// </summary>
        public Uri GetRandomProxy(ProxyPoolOptions options)
        {
            // create a list of proxies we can work with
            IList <Uri> workList = new List <Uri>(myProxies);

            int proxyIdx = -1;
            Uri proxy    = null;

            while (workList.Count > 0)
            {
                // select a valid index
                proxyIdx = myRandom.Next() % workList.Count;

                proxy = workList[proxyIdx];
                workList.RemoveAt(proxyIdx);

                if (options == ProxyPoolOptions.None)
                {
                    return(proxy);
                }
                else if (options == ValidateProxy(proxy, options))
                {
                    return(proxy);
                }
            }

            return(proxy);
        }
Example #2
0
        public ProxyPoolOptions ValidateProxy( Uri proxy, ProxyPoolOptions options )
        {
            if ( options == ProxyPoolOptions.None )
            {
                return ProxyPoolOptions.None;
            }

            ProxyPoolOptions retOptions = ProxyPoolOptions.None;

            HttpWebResponse httpRes = null;

            try
            {
                HttpWebRequest httpReq = (HttpWebRequest)WebRequest.Create( myProxyTestUrl );
                httpReq.AllowAutoRedirect = false;

                WebProxy webProxy = new WebProxy( proxy );
                httpReq.Proxy = webProxy;

                httpRes = (HttpWebResponse)httpReq.GetResponse();

                // check availability
                // ProxyOptions.IsAvailable is implied
                if ( httpRes.StatusCode == HttpStatusCode.OK &&
                    httpRes.ResponseUri.ToString().StartsWith( httpReq.RequestUri.ToString(), StringComparison.OrdinalIgnoreCase ) )
                {
                    retOptions |= ProxyPoolOptions.IsAvailable;
                }
                else
                {
                    // no further tests possible
                    return retOptions;
                }

                // check for Captchas
                if ( (options & ProxyPoolOptions.UsesCaptchas) == ProxyPoolOptions.UsesCaptchas ||
                     (options & ProxyPoolOptions.NotUsesCaptchas) == ProxyPoolOptions.NotUsesCaptchas )
                {
                    Stream stream = httpRes.GetResponseStream();

                    string html = "";
                    using ( StreamReader reader = new StreamReader( stream, Encoding.UTF8 ) )
                    {
                        html = reader.ReadToEnd();
                    }

                    if ( html.IndexOf( "<title>Google</title>", StringComparison.OrdinalIgnoreCase ) >= 0 )
                    {
                        retOptions |= ProxyPoolOptions.NotUsesCaptchas;
                    }
                    else
                    {
                        retOptions |= ProxyPoolOptions.UsesCaptchas;
                    }
                }
            }
            catch ( Exception )
            {
                // TODO: log the exception
                retOptions = ProxyPoolOptions.None;
            }
            finally
            {
                if ( httpRes != null )
                {
                    httpRes.Close();
                }
            }

            return retOptions;
        }
Example #3
0
        public ProxyPoolOptions ValidateProxy(Uri proxy, ProxyPoolOptions options)
        {
            if (options == ProxyPoolOptions.None)
            {
                return(ProxyPoolOptions.None);
            }

            ProxyPoolOptions retOptions = ProxyPoolOptions.None;

            HttpWebResponse httpRes = null;

            try
            {
                HttpWebRequest httpReq = (HttpWebRequest)WebRequest.Create(myProxyTestUrl);
                httpReq.AllowAutoRedirect = false;

                WebProxy webProxy = new WebProxy(proxy);
                httpReq.Proxy = webProxy;

                httpRes = (HttpWebResponse)httpReq.GetResponse();

                // check availability
                // ProxyOptions.IsAvailable is implied
                if (httpRes.StatusCode == HttpStatusCode.OK &&
                    httpRes.ResponseUri.ToString().StartsWith(httpReq.RequestUri.ToString(), StringComparison.OrdinalIgnoreCase))
                {
                    retOptions |= ProxyPoolOptions.IsAvailable;
                }
                else
                {
                    // no further tests possible
                    return(retOptions);
                }

                // check for Captchas
                if ((options & ProxyPoolOptions.UsesCaptchas) == ProxyPoolOptions.UsesCaptchas ||
                    (options & ProxyPoolOptions.NotUsesCaptchas) == ProxyPoolOptions.NotUsesCaptchas)
                {
                    Stream stream = httpRes.GetResponseStream();

                    string html = "";
                    using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
                    {
                        html = reader.ReadToEnd();
                    }

                    if (html.IndexOf("<title>Google</title>", StringComparison.OrdinalIgnoreCase) >= 0)
                    {
                        retOptions |= ProxyPoolOptions.NotUsesCaptchas;
                    }
                    else
                    {
                        retOptions |= ProxyPoolOptions.UsesCaptchas;
                    }
                }
            }
            catch (Exception)
            {
                // TODO: log the exception
                retOptions = ProxyPoolOptions.None;
            }
            finally
            {
                if (httpRes != null)
                {
                    httpRes.Close();
                }
            }

            return(retOptions);
        }
Example #4
0
        /// <summary>
        /// If options are None then the selected proxy is not validated.
        /// </summary>
        public Uri GetRandomProxy( ProxyPoolOptions options )
        {
            // create a list of proxies we can work with
            IList<Uri> workList = new List<Uri>( myProxies );

            int proxyIdx = -1;
            Uri proxy = null;
            while ( workList.Count > 0 )
            {
                // select a valid index
                proxyIdx = myRandom.Next() % workList.Count;

                proxy = workList[ proxyIdx ];
                workList.RemoveAt( proxyIdx );

                if ( options == ProxyPoolOptions.None )
                {
                    return proxy;
                }
                else if ( options == ValidateProxy( proxy, options ) )
                {
                    return proxy;
                }
            }

            return proxy;
        }