def GetDefaultProxyInfo(method='http'): """Get ProxyInfo from environment. This function is meant to mimic httplib2.proxy_info_from_environment, but get the proxy information from urllib.getproxies instead. urllib can also get proxy information from Windows Internet Explorer settings or MacOSX framework SystemConfiguration. Args: method: protocol string Returns: httplib2 ProxyInfo object or None """ proxy_dict = urllib.getproxies() proxy_url = proxy_dict.get(method, None) if not proxy_url: return None pi = httplib2.proxy_info_from_url(proxy_url, method) # The ProxyInfo object has a bypass_host method that takes the hostname as an # argument and it returns 1 or 0 based on if the hostname should bypass the # proxy or not. We could either build the bypassed hosts list and pass it to # pi.bypass_hosts, or we can just replace the method with the function in # urllib, and completely mimic urllib logic. We do the latter. # Since the urllib.proxy_bypass _function_ (no self arg) is not "bound" to the # class instance, it doesn't receive the self arg when its called. We don't # need to "bind" it via types.MethodType(urllib.proxy_bypass, pi). pi.bypass_host = urllib.proxy_bypass return pi
def ProxyInfoFromEnvironmentVar(proxy_env_var): """Reads proxy info from the environment and converts to httplib2.ProxyInfo. Args: proxy_env_var: Environment variable string to read, such as http_proxy or https_proxy. Returns: httplib2.ProxyInfo constructed from the environment string. """ proxy_url = os.environ.get(proxy_env_var) if not proxy_url or not proxy_env_var.lower().startswith('http'): return httplib2.ProxyInfo(httplib2.socks.PROXY_TYPE_HTTP, None, 0) proxy_protocol = proxy_env_var.lower().split('_')[0] if not proxy_url.lower().startswith('http'): # proxy_info_from_url requires a protocol, which is always http or https. proxy_url = proxy_protocol + '://' + proxy_url return httplib2.proxy_info_from_url(proxy_url, method=proxy_protocol)
def proxy_info_from_environment_var(proxy_env_var): """Reads proxy info from the environment and converts to httplib2.ProxyInfo. Args: proxy_env_var: environment variable string to read, http_proxy or https_proxy (in lower case). Example: http://myproxy.domain.com:8080 Returns: httplib2.ProxyInfo constructed from the environment string. """ proxy_url = os.environ.get(proxy_env_var) if not proxy_url: return None proxy_protocol = proxy_env_var.lower().split('_')[0] if not re.match('^https?://', proxy_url, flags=re.IGNORECASE): logging.warn("proxy_info_from_url requires a protocol, which is always " "http or https.") proxy_url = proxy_protocol + '://' + proxy_url return httplib2.proxy_info_from_url(proxy_url, method=proxy_protocol)
def get_gcs_proxy_info(self): if CONF.backup_gcs_proxy_url: return httplib2.proxy_info_from_url(CONF.backup_gcs_proxy_url) else: return httplib2.proxy_info_from_environment()
def test_from_url_ident(): pi = httplib2.proxy_info_from_url("http://*****:*****@someproxy:99") assert pi.proxy_host == "someproxy" assert pi.proxy_port == 99 assert pi.proxy_user == "zoidberg" assert pi.proxy_pass == "fish"
def test_from_url(): pi = httplib2.proxy_info_from_url("http://myproxy.example.com") assert pi.proxy_host == "myproxy.example.com" assert pi.proxy_port == 80 assert pi.proxy_user is None