/// <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); }
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; }
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); }
/// <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; }