diff --git a/tests/unit/http/test_http_client.py b/tests/unit/http/test_http_client.py index a61326bcf7..6db824c0ef 100644 --- a/tests/unit/http/test_http_client.py +++ b/tests/unit/http/test_http_client.py @@ -1,5 +1,7 @@ # -*- coding: utf-8 -*- import unittest +import os +from collections import OrderedDict from mock import patch, Mock from requests import Session @@ -137,17 +139,37 @@ def test_last_response_empty_on_error(self): self.assertIsNone(self.client.last_response) def test_request_behind_proxy(self): - proxies = { - 'http': 'http://proxy.twilio.com', - 'https': 'https://proxy.twilio.com', - } + self.request_mock.url = 'https://api.twilio.com/' + proxies = OrderedDict([ + ('http', 'http://proxy.twilio.com'), + ('https', 'https://proxy.twilio.com'), + ]) self.client = TwilioHttpClient(proxy=proxies) self.client.request('doesnt matter', 'doesnt matter') - self.assertEqual(proxies, self.session_mock.proxies) + self.session_mock.send.assert_called_once_with( + self.request_mock, verify=True, proxies=proxies, stream=False, + cert=None, allow_redirects=False, timeout=None + ) + + @patch.dict(os.environ, { + "HTTP_PROXY": "http://proxy.twilio.com", + "HTTPS_PROXY": "https://proxy.twilio.com" + }) + def test_request_behind_proxy_from_environment(self): + self.request_mock.url = 'https://api.twilio.com/' + self.client = TwilioHttpClient() + self.client.request('doesnt matter', 'doesnt matter') + self.session_mock.send.assert_called_once_with( + self.request_mock, verify=True, proxies=OrderedDict([ + ('http', 'http://proxy.twilio.com'), + ('https', 'https://proxy.twilio.com'), + ]), stream=False, cert=None, allow_redirects=False, timeout=None + ) def test_exception_with_details(self): + self.request_mock.url = 'https://api.twilio.com/' v1 = MyVersion(self.client) - error_text = """{ + error_text = """{ "code": 20001, "message": "Bad request", "more_info": "https://www.twilio.com/docs/errors/20001", @@ -179,7 +201,7 @@ def tearDown(self): def _setup_session_response(self, value): session_mock = Mock(wraps=Session()) - request_mock = Mock() + request_mock = Mock(url='https://api.twilio.com/') session_mock.prepare_request.return_value = request_mock session_mock.send.return_value = Response(200, value) diff --git a/twilio/http/http_client.py b/twilio/http/http_client.py index a9ce024a2a..320bdafe12 100644 --- a/twilio/http/http_client.py +++ b/twilio/http/http_client.py @@ -39,7 +39,7 @@ def __init__(self, pool_connections=True, request_hooks=None, timeout=None, logg if timeout is not None and timeout <= 0: raise ValueError(timeout) self.timeout = timeout - self.proxy = proxy + self.proxy = proxy if proxy else {} def request(self, method, url, params=None, data=None, headers=None, auth=None, timeout=None, allow_redirects=False): @@ -82,17 +82,17 @@ def request(self, method, url, params=None, data=None, headers=None, auth=None, self.last_response = None session = self.session or Session() - if self.proxy: - session.proxies = self.proxy request = Request(**kwargs) self.last_request = TwilioRequest(**kwargs) prepped_request = session.prepare_request(request) - response = session.send( - prepped_request, - allow_redirects=allow_redirects, - timeout=timeout if timeout is not None else self.timeout, - ) + + settings = session.merge_environment_settings(prepped_request.url, self.proxy, None, None, None) + + settings['allow_redirects'] = allow_redirects + settings['timeout'] = timeout if timeout is not None else self.timeout + + response = session.send(prepped_request, **settings) self.logger.info('{method} Response: {status} {text}'.format( method=method, status=response.status_code, text=response.text)