Exemple #1
0
    def test_proxy_verified(self):
        with proxy_from_url(self.proxy_url,
                            cert_reqs="REQUIRED",
                            ca_certs=DEFAULT_CA_BAD) as http:
            https_pool = http._new_pool("https", self.https_host,
                                        self.https_port)
            with pytest.raises(MaxRetryError) as e:
                https_pool.request("GET", "/", retries=0)
            assert isinstance(e.value.reason, SSLError)
            assert "certificate verify failed" in str(e.value.reason), (
                "Expected 'certificate verify failed', instead got: %r" %
                e.value.reason)

        with proxy_from_url(self.proxy_url,
                            cert_reqs="REQUIRED",
                            ca_certs=DEFAULT_CA) as http:
            https_pool = http._new_pool("https", self.https_host,
                                        self.https_port)

            https_pool.request("GET",
                               "/")  # Should succeed without exceptions.

        with proxy_from_url(self.proxy_url,
                            cert_reqs="REQUIRED",
                            ca_certs=DEFAULT_CA) as http:
            https_fail_pool = http._new_pool("https", "127.0.0.1",
                                             self.https_port)

            with pytest.raises(MaxRetryError) as e:
                https_fail_pool.request("GET", "/", retries=0)
            assert isinstance(e.value.reason, SSLError)
            assert "doesn't match" in str(e.value.reason)
Exemple #2
0
    def test_basic_ipv6_proxy(self):
        with proxy_from_url(self.proxy_url, ca_certs=DEFAULT_CA) as http:
            r = http.request("GET", "%s/" % self.http_url)
            assert r.status == 200

            r = http.request("GET", "%s/" % self.https_url)
            assert r.status == 200
Exemple #3
0
    def test_scheme_host_case_insensitive(self):
        """Assert that upper-case schemes and hosts are normalized."""
        with proxy_from_url(self.proxy_url.upper(),
                            ca_certs=DEFAULT_CA) as http:
            r = http.request("GET", "%s/" % self.http_url.upper())
            assert r.status == 200

            r = http.request("GET", "%s/" % self.https_url.upper())
            assert r.status == 200
Exemple #4
0
    def test_proxy_conn_fail(self):
        host, port = get_unreachable_address()
        with proxy_from_url("http://%s:%s/" % (host, port),
                            retries=1,
                            timeout=LONG_TIMEOUT) as http:
            with pytest.raises(MaxRetryError):
                http.request("GET", "%s/" % self.https_url)
            with pytest.raises(MaxRetryError):
                http.request("GET", "%s/" % self.http_url)

            with pytest.raises(MaxRetryError) as e:
                http.request("GET", "%s/" % self.http_url)
            assert type(e.value.reason) == ProxyError
Exemple #5
0
 def test_nagle_proxy(self):
     """ Test that proxy connections do not have TCP_NODELAY turned on """
     with proxy_from_url(self.proxy_url) as http:
         hc2 = http.connection_from_host(self.http_host, self.http_port)
         conn = hc2._get_conn()
         try:
             hc2._make_request(conn, "GET", "/")
             tcp_nodelay_setting = conn._sock._getsockopt_tcp_nodelay()
             assert tcp_nodelay_setting == 0, (
                 "Expected TCP_NODELAY for proxies to be set "
                 "to zero, instead was %s" % tcp_nodelay_setting)
         finally:
             conn.close()
Exemple #6
0
    def test_headerdict(self):
        default_headers = HTTPHeaderDict(a="b")
        proxy_headers = HTTPHeaderDict()
        proxy_headers.add("foo", "bar")

        with proxy_from_url(self.proxy_url,
                            headers=default_headers,
                            proxy_headers=proxy_headers) as http:
            request_headers = HTTPHeaderDict(baz="quux")
            r = http.request("GET",
                             "%s/headers" % self.http_url,
                             headers=request_headers)
            returned_headers = json.loads(r.data.decode())
            assert returned_headers.get("Foo") == "bar"
            assert returned_headers.get("Baz") == "quux"
Exemple #7
0
    def test_proxy_pooling(self):
        with proxy_from_url(self.proxy_url, cert_reqs="NONE") as http:
            for x in range(2):
                http.urlopen("GET", self.http_url)
            assert len(http.pools) == 1

            for x in range(2):
                http.urlopen("GET", self.http_url_alt)
            assert len(http.pools) == 1

            for x in range(2):
                http.urlopen("GET", self.https_url)
            assert len(http.pools) == 2

            for x in range(2):
                http.urlopen("GET", self.https_url_alt)
            assert len(http.pools) == 3
Exemple #8
0
    def test_cross_protocol_redirect(self):
        with proxy_from_url(self.proxy_url, ca_certs=DEFAULT_CA) as http:
            cross_protocol_location = "%s/echo?a=b" % self.https_url
            with pytest.raises(MaxRetryError):
                http.request(
                    "GET",
                    "%s/redirect" % self.http_url,
                    fields={"target": cross_protocol_location},
                    retries=0,
                )

            r = http.request(
                "GET",
                "%s/redirect" % self.http_url,
                fields={"target": "%s/echo?a=b" % self.https_url},
                retries=1,
            )
            assert r._pool.host == self.https_host
Exemple #9
0
    def test_cross_host_redirect(self):
        with proxy_from_url(self.proxy_url) as http:
            cross_host_location = "%s/echo?a=b" % self.http_url_alt
            with pytest.raises(MaxRetryError):
                http.request(
                    "GET",
                    "%s/redirect" % self.http_url,
                    fields={"target": cross_host_location},
                    retries=0,
                )

            r = http.request(
                "GET",
                "%s/redirect" % self.http_url,
                fields={"target": "%s/echo?a=b" % self.http_url_alt},
                retries=1,
            )
            assert r._pool.host != self.http_host_alt
Exemple #10
0
    def test_redirect(self):
        with proxy_from_url(self.proxy_url) as http:
            r = http.request(
                "GET",
                "%s/redirect" % self.http_url,
                fields={"target": "%s/" % self.http_url},
                redirect=False,
            )

            assert r.status == 303

            r = http.request(
                "GET",
                "%s/redirect" % self.http_url,
                fields={"target": "%s/" % self.http_url},
            )

            assert r.status == 200
            assert r.data == b"Dummy server!"
Exemple #11
0
    def test_proxy_pooling_ext(self):
        with proxy_from_url(self.proxy_url) as http:
            hc1 = http.connection_from_url(self.http_url)
            hc2 = http.connection_from_host(self.http_host, self.http_port)
            hc3 = http.connection_from_url(self.http_url_alt)
            hc4 = http.connection_from_host(self.http_host_alt, self.http_port)
            assert hc1 == hc2
            assert hc2 == hc3
            assert hc3 == hc4

            sc1 = http.connection_from_url(self.https_url)
            sc2 = http.connection_from_host(self.https_host,
                                            self.https_port,
                                            scheme="https")
            sc3 = http.connection_from_url(self.https_url_alt)
            sc4 = http.connection_from_host(self.https_host_alt,
                                            self.https_port,
                                            scheme="https")
            assert sc1 == sc2
            assert sc2 != sc3
            assert sc3 == sc4
Exemple #12
0
 def test_https_proxy_pool_timeout(self):
     with proxy_from_url("https://{host}".format(host=TARPIT_HOST),
                         timeout=SHORT_TIMEOUT) as https:
         with pytest.raises(MaxRetryError) as e:
             https.request("GET", self.http_url)
         assert type(e.value.reason) == ConnectTimeoutError
Exemple #13
0
    def test_headers(self):
        with proxy_from_url(
                self.proxy_url,
                headers={"Foo": "bar"},
                proxy_headers={"Hickory": "dickory"},
                ca_certs=DEFAULT_CA,
        ) as http:
            r = http.request_encode_url("GET", "%s/headers" % self.http_url)
            returned_headers = json.loads(r.data.decode())
            assert returned_headers.get("Foo") == "bar"
            assert returned_headers.get("Hickory") == "dickory"
            assert returned_headers.get("Host") == "%s:%s" % (
                self.http_host,
                self.http_port,
            )

            r = http.request_encode_url("GET",
                                        "%s/headers" % self.http_url_alt)
            returned_headers = json.loads(r.data.decode())
            assert returned_headers.get("Foo") == "bar"
            assert returned_headers.get("Hickory") == "dickory"
            assert returned_headers.get("Host") == "%s:%s" % (
                self.http_host_alt,
                self.http_port,
            )

            r = http.request_encode_url("GET", "%s/headers" % self.https_url)
            returned_headers = json.loads(r.data.decode())
            assert returned_headers.get("Foo") == "bar"
            assert returned_headers.get("Hickory") is None
            assert returned_headers.get("Host") == "%s:%s" % (
                self.https_host,
                self.https_port,
            )

            r = http.request_encode_body("POST", "%s/headers" % self.http_url)
            returned_headers = json.loads(r.data.decode())
            assert returned_headers.get("Foo") == "bar"
            assert returned_headers.get("Hickory") == "dickory"
            assert returned_headers.get("Host") == "%s:%s" % (
                self.http_host,
                self.http_port,
            )

            r = http.request_encode_url("GET",
                                        "%s/headers" % self.http_url,
                                        headers={"Baz": "quux"})
            returned_headers = json.loads(r.data.decode())
            assert returned_headers.get("Foo") is None
            assert returned_headers.get("Baz") == "quux"
            assert returned_headers.get("Hickory") == "dickory"
            assert returned_headers.get("Host") == "%s:%s" % (
                self.http_host,
                self.http_port,
            )

            r = http.request_encode_url("GET",
                                        "%s/headers" % self.https_url,
                                        headers={"Baz": "quux"})
            returned_headers = json.loads(r.data.decode())
            assert returned_headers.get("Foo") is None
            assert returned_headers.get("Baz") == "quux"
            assert returned_headers.get("Hickory") is None
            assert returned_headers.get("Host") == "%s:%s" % (
                self.https_host,
                self.https_port,
            )

            r = http.request_encode_body("GET",
                                         "%s/headers" % self.http_url,
                                         headers={"Baz": "quux"})
            returned_headers = json.loads(r.data.decode())
            assert returned_headers.get("Foo") is None
            assert returned_headers.get("Baz") == "quux"
            assert returned_headers.get("Hickory") == "dickory"
            assert returned_headers.get("Host") == "%s:%s" % (
                self.http_host,
                self.http_port,
            )

            r = http.request_encode_body("GET",
                                         "%s/headers" % self.https_url,
                                         headers={"Baz": "quux"})
            returned_headers = json.loads(r.data.decode())
            assert returned_headers.get("Foo") is None
            assert returned_headers.get("Baz") == "quux"
            assert returned_headers.get("Hickory") is None
            assert returned_headers.get("Host") == "%s:%s" % (
                self.https_host,
                self.https_port,
            )