"""These tests rely on replies from public internet services
TODO: reimplement with local stubs
"""
import httplib2
import os
import pytest
import ssl
import sys
import tests
def test_get_301_via_https():
# Google always redirects to http://google.com
http = httplib2.Http()
response, content = http.request("https://code.google.com/apis/", "GET")
assert response.status == 200
assert response.previous.status == 301
def test_get_via_https():
# Test that we can handle HTTPS
http = httplib2.Http()
response, content = http.request("https://google.com/adsense/", "GET")
assert response.status == 200
def test_get_via_https_spec_violation_on_location():
# Test that we follow redirects through HTTPS
# even if they violate the spec by including
# a relative Location: header instead of an
# absolute one.
http = httplib2.Http()
response, content = http.request("https://google.com/adsense", "GET")
assert response.status == 200
assert response.previous is not None
def test_get_via_https_key_cert():
# At this point I can only test
# that the key and cert files are passed in
# correctly to httplib. It would be nice to have
# a real https endpoint to test against.
http = httplib2.Http(timeout=2)
http.add_certificate("akeyfile", "acertfile", "bitworking.org")
try:
http.request("https://bitworking.org", "GET")
except AttributeError:
assert http.connections["https:bitworking.org"].key_file == "akeyfile"
assert http.connections["https:bitworking.org"].cert_file == "acertfile"
except IOError:
# Skip on 3.2
pass
try:
http.request("https://notthere.bitworking.org", "GET")
except httplib2.ServerNotFoundError:
assert http.connections["https:notthere.bitworking.org"].key_file is None
assert http.connections["https:notthere.bitworking.org"].cert_file is None
except IOError:
# Skip on 3.2
pass
def test_ssl_invalid_ca_certs_path():
# Test that we get an ssl.SSLError when specifying a non-existent CA
# certs file.
http = httplib2.Http(ca_certs="/nosuchfile")
with tests.assert_raises(IOError):
http.request("https://www.google.com/", "GET")
@pytest.mark.xfail(
sys.version_info <= (3,),
reason=(
"FIXME: for unknown reason Python 2.7.10 validates www.google.com "
"against dummy CA www.example.com"
),
)
def test_ssl_wrong_ca():
# Test that we get a SSLHandshakeError if we try to access
# https://www.google.com, using a CA cert file that doesn't contain
# the CA Google uses (i.e., simulating a cert that's not signed by a
# trusted CA).
other_ca_certs = os.path.join(
os.path.dirname(os.path.abspath(httplib2.__file__)), "test", "other_cacerts.txt"
)
assert os.path.exists(other_ca_certs)
http = httplib2.Http(ca_certs=other_ca_certs)
http.follow_redirects = False
with tests.assert_raises(ssl.SSLError):
http.request("https://www.google.com/", "GET")
def test_sni_hostname_validation():
# TODO: make explicit test server with SNI validation
http = httplib2.Http()
http.request("https://google.com/", method="GET")