Skip to content

Commit

Permalink
Respect HTTPS_PROXY and other settings from env vars
Browse files Browse the repository at this point in the history
  • Loading branch information
AlanCoding committed Mar 21, 2022
1 parent d6ed109 commit 7c4bace
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 15 deletions.
36 changes: 29 additions & 7 deletions tests/unit/http/test_http_client.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# -*- coding: utf-8 -*-
import unittest
import os
from collections import OrderedDict

from mock import patch, Mock
from requests import Session
Expand Down Expand Up @@ -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",
Expand Down Expand Up @@ -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)
Expand Down
16 changes: 8 additions & 8 deletions twilio/http/http_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down Expand Up @@ -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)
Expand Down

0 comments on commit 7c4bace

Please sign in to comment.