This repository has been archived by the owner on Apr 26, 2024. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 2.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Allow providing credentials to
http_proxy
(#10360)
- Loading branch information
Showing
3 changed files
with
64 additions
and
14 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
Allow providing credentials to `http_proxy`. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -205,6 +205,41 @@ def test_https_request_via_no_proxy_star(self): | |
|
||
@patch.dict(os.environ, {"http_proxy": "proxy.com:8888", "no_proxy": "unused.com"}) | ||
def test_http_request_via_proxy(self): | ||
""" | ||
Tests that requests can be made through a proxy. | ||
""" | ||
self._do_http_request_via_proxy(auth_credentials=None) | ||
|
||
@patch.dict( | ||
os.environ, | ||
{"http_proxy": "bob:[email protected]:8888", "no_proxy": "unused.com"}, | ||
) | ||
def test_http_request_via_proxy_with_auth(self): | ||
""" | ||
Tests that authenticated requests can be made through a proxy. | ||
""" | ||
self._do_http_request_via_proxy(auth_credentials="bob:pinkponies") | ||
|
||
@patch.dict(os.environ, {"https_proxy": "proxy.com", "no_proxy": "unused.com"}) | ||
def test_https_request_via_proxy(self): | ||
"""Tests that TLS-encrypted requests can be made through a proxy""" | ||
self._do_https_request_via_proxy(auth_credentials=None) | ||
|
||
@patch.dict( | ||
os.environ, | ||
{"https_proxy": "bob:[email protected]", "no_proxy": "unused.com"}, | ||
) | ||
def test_https_request_via_proxy_with_auth(self): | ||
"""Tests that authenticated, TLS-encrypted requests can be made through a proxy""" | ||
self._do_https_request_via_proxy(auth_credentials="bob:pinkponies") | ||
|
||
def _do_http_request_via_proxy( | ||
self, | ||
auth_credentials: Optional[str] = None, | ||
): | ||
""" | ||
Tests that requests can be made through a proxy. | ||
""" | ||
agent = ProxyAgent(self.reactor, use_proxy=True) | ||
|
||
self.reactor.lookups["proxy.com"] = "1.2.3.5" | ||
|
@@ -229,6 +264,23 @@ def test_http_request_via_proxy(self): | |
self.assertEqual(len(http_server.requests), 1) | ||
|
||
request = http_server.requests[0] | ||
|
||
# Check whether auth credentials have been supplied to the proxy | ||
proxy_auth_header_values = request.requestHeaders.getRawHeaders( | ||
b"Proxy-Authorization" | ||
) | ||
|
||
if auth_credentials is not None: | ||
# Compute the correct header value for Proxy-Authorization | ||
encoded_credentials = base64.b64encode(b"bob:pinkponies") | ||
expected_header_value = b"Basic " + encoded_credentials | ||
|
||
# Validate the header's value | ||
self.assertIn(expected_header_value, proxy_auth_header_values) | ||
else: | ||
# Check that the Proxy-Authorization header has not been supplied to the proxy | ||
self.assertIsNone(proxy_auth_header_values) | ||
|
||
self.assertEqual(request.method, b"GET") | ||
self.assertEqual(request.path, b"http://test.com") | ||
self.assertEqual(request.requestHeaders.getRawHeaders(b"host"), [b"test.com"]) | ||
|
@@ -241,19 +293,6 @@ def test_http_request_via_proxy(self): | |
body = self.successResultOf(treq.content(resp)) | ||
self.assertEqual(body, b"result") | ||
|
||
@patch.dict(os.environ, {"https_proxy": "proxy.com", "no_proxy": "unused.com"}) | ||
def test_https_request_via_proxy(self): | ||
"""Tests that TLS-encrypted requests can be made through a proxy""" | ||
self._do_https_request_via_proxy(auth_credentials=None) | ||
|
||
@patch.dict( | ||
os.environ, | ||
{"https_proxy": "bob:[email protected]", "no_proxy": "unused.com"}, | ||
) | ||
def test_https_request_via_proxy_with_auth(self): | ||
"""Tests that authenticated, TLS-encrypted requests can be made through a proxy""" | ||
self._do_https_request_via_proxy(auth_credentials="bob:pinkponies") | ||
|
||
def _do_https_request_via_proxy( | ||
self, | ||
auth_credentials: Optional[str] = None, | ||
|