"""Proxy tests.
Tests do modify `os.environ` global states. Each test must be run in separate
process. Must use `pytest --forked` or similar technique.
"""
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import httplib2
import mock
import os
import pytest
import socket
import tests
from six.moves import urllib
def _raise_name_not_known_error(*args, **kwargs):
raise socket.gaierror(socket.EAI_NONAME, "Name or service not known")
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
def test_from_url_ident():
pi = httplib2.proxy_info_from_url("http://zoidberg:fish@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_env():
os.environ["http_proxy"] = "http://myproxy.example.com:8080"
pi = httplib2.proxy_info_from_environment()
assert pi.proxy_host == "myproxy.example.com"
assert pi.proxy_port == 8080
def test_from_env_https():
os.environ["http_proxy"] = "http://myproxy.example.com:80"
os.environ["https_proxy"] = "http://myproxy.example.com:81"
pi = httplib2.proxy_info_from_environment("https")
assert pi.proxy_host == "myproxy.example.com"
assert pi.proxy_port == 81
def test_from_env_none():
os.environ.clear()
pi = httplib2.proxy_info_from_environment()
assert pi is None
def test_applies_to():
os.environ["http_proxy"] = "http://myproxy.example.com:80"
os.environ["https_proxy"] = "http://myproxy.example.com:81"
os.environ["no_proxy"] = "localhost,example.com,.wildcard"
pi = httplib2.proxy_info_from_environment()
assert not pi.applies_to("localhost")
assert pi.applies_to("www.google.com")
assert pi.applies_to("prefixlocalhost")
assert pi.applies_to("www.example.com")
assert pi.applies_to("sub.example.com")
assert not pi.applies_to("sub.wildcard")
assert not pi.applies_to("pub.sub.wildcard")
def test_noproxy_trailing_comma():
os.environ["http_proxy"] = "http://myproxy.example.com:80"
os.environ["no_proxy"] = "localhost,other.host,"
pi = httplib2.proxy_info_from_environment()
assert not pi.applies_to("localhost")
assert not pi.applies_to("other.host")
assert pi.applies_to("example.domain")
def test_noproxy_star():
os.environ["http_proxy"] = "http://myproxy.example.com:80"
os.environ["NO_PROXY"] = "*"
pi = httplib2.proxy_info_from_environment()
for host in ("localhost", "169.254.38.192", "www.google.com"):
assert not pi.applies_to(host)
def test_headers():
headers = {"key0": "val0", "key1": "val1"}
pi = httplib2.ProxyInfo(
httplib2.socks.PROXY_TYPE_HTTP, "localhost", 1234, proxy_headers=headers
)
assert pi.proxy_headers == headers
@pytest.mark.skipif(
os.environ.get("TRAVIS_PYTHON_VERSION") in ("2.7", "pypy"),
reason="Fails on Travis py27/pypy, works elsewhere. "
"See https://travis-ci.org/httplib2/httplib2/jobs/408769880.",
)
@mock.patch("socket.socket.connect", spec=True)
def test_server_not_found_error_is_raised_for_invalid_hostname(mock_socket_connect):
"""Invalidates https://github.com/httplib2/httplib2/pull/100."""
mock_socket_connect.side_effect = _raise_name_not_known_error
http = httplib2.Http(
proxy_info=httplib2.ProxyInfo(
httplib2.socks.PROXY_TYPE_HTTP, "255.255.255.255", 8001
)
)
with tests.assert_raises(httplib2.ServerNotFoundError):
http.request("http://invalid.hostname.foo.bar/", "GET")
def test_auth_str_bytes():
# https://github.com/httplib2/httplib2/pull/115
# Proxy-Authorization b64encode() TypeError: a bytes-like object is required, not 'str'
with tests.server_const_http(request_count=2) as uri:
uri_parsed = urllib.parse.urlparse(uri)
http = httplib2.Http(
proxy_info=httplib2.ProxyInfo(
httplib2.socks.PROXY_TYPE_HTTP,
proxy_host=uri_parsed.hostname,
proxy_port=uri_parsed.port,
proxy_rdns=True,
proxy_user=u"user_str",
proxy_pass=u"pass_str",
)
)
response, _ = http.request(uri, "GET")
assert response.status == 200
with tests.server_const_http(request_count=2) as uri:
uri_parsed = urllib.parse.urlparse(uri)
http = httplib2.Http(
proxy_info=httplib2.ProxyInfo(
httplib2.socks.PROXY_TYPE_HTTP,
proxy_host=uri_parsed.hostname,
proxy_port=uri_parsed.port,
proxy_rdns=True,
proxy_user=b"user_bytes",
proxy_pass=b"pass_bytes",
)
)
response, _ = http.request(uri, "GET")
assert response.status == 200