8000 Add custom timeout to TwilioHttpClient constructor (#485) · githubib/twilio-python@53511c1 · GitHub
[go: up one dir, main page]

Skip to content

Commit 53511c1

Browse files
Kerl1310eshanholtz
authored andcommitted
Add custom timeout to TwilioHttpClient constructor (twilio#485)
* Adds timeout to TwilioHttpClient constructor * Adds unit tests and code alterations to cover various scenarios detailed in PR discussion
1 parent b139cb3 commit 53511c1

File tree

2 files changed

+72
-6
lines changed

2 files changed

+72
-6
lines changed

tests/unit/http/test_http_client.py

Lines changed: 56 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
11
# -*- coding: utf-8 -*-
2-
32
import six
43

54
import unittest
65

7-
import mock
86
from mock import patch, Mock
9-
from requests import Request
10-
from requests import Session
7+
from requests import Request, Session
118

129
from twilio.http.http_client import TwilioHttpClient
1310
from twilio.http.response import Response
@@ -42,6 +39,61 @@ def test_request_sets_host_header_if_missing(self):
4239
self.assertIsNotNone(self.client.last_request)
4340
self.assertIsNotNone(self.client.last_response)
4441

42+
def test_request_with_timeout(self):
43+
self.request_mock.url = 'https://api.twilio.com/'
44+
self.request_mock.headers = {'Host': 'other.twilio.com'}
45+
46+
response = self.client.request(
47+
'doesnt matter', 'doesnt matter', None, None, None, None, 30, None)
48+
49+
self.assertEqual('other.twilio.com', self.request_mock.headers['Host'])
50+
self.assertEqual(200, response.status_code)
51+
self.assertEqual('testing-unicode: Ω≈ç√, 💩', response.content)
52+
53+
def test_request_where_method_timeout_equals_zero(self):
54+
self.request_mock.url = 'https://api.twilio.com/'
55+
self.request_mock.headers = {'Host': 'other.twilio.com'}
56+
57+
try:
58+
self.client.request(
59+
'doesnt matter', 'doesnt matter', None, None, None, None, 0, None)
60+
except Exception as e:
61+
self.assertEqual(ValueError, type(e))
62+
63+
def test_request_where_class_timeout_manually_set(self):
64+
self.request_mock.url = 'https://api.twilio.com/'
65+
self.request_mock.headers = {'Host': 'other.twilio.com'}
66+
self.client.timeout = 30
67+
68+
response = self.client.request(
69+
'doesnt matter', 'doesnt matter')
70+
self.assertEqual('other.twilio.com', self.request_mock.headers['Host'])
71+
self.assertEqual(200, response.status_code)
72+
self.assertEqual('testing-unicode: Ω≈ç√, 💩', response.content)
73+
74+
def test_request_where_class_timeout_equals_zero(self):
75+
self.request_mock.url = 'https://api.twilio.com/'
76+
self.request_mock.headers = {'Host': 'other.twilio.com'}
77+
self.client.timeout = 0
78+
79+
try:
80+
self.client.request(
81+
'doesnt matter', 'doesnt matter')
82+
except Exception as e:
83+
self.assertEqual(type(e), ValueError)
84+
85+
def test_request_where_class_timeout_and_method_timeout_set(self):
86+
self.request_mock.url = 'https://api.twilio.com/'
87+
self.request_mock.headers = {'Host': 'other.twilio.com'}
88+
self.client.timeout = 30
89+
90+
response = self.client.request(
91+
'doesnt matter', 'doesnt matter', None, None, None, None, 15, None)
92+
93+
self.assertEqual('other.twilio.com', self.request_mock.headers['Host'])
94+
self.assertEqual(200, response.status_code)
95+
self.assertEqual('testing-unicode: Ω≈ç√, 💩', response.content)
96+
4597
def test_request_with_unicode_response(self):
4698
self.request_mock.url = 'https://api.twilio.com/'
4799
self.request_mock.headers = {'Host': 'other.twilio.com'}

twilio/http/http_client.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,24 @@ class TwilioHttpClient(HttpClient):
1313
"""
1414
General purpose HTTP Client for interacting with the Twilio API
1515
"""
16-
def __init__(self, pool_connections=True, request_hooks=None):
16+
def __init__(self, pool_connections=True, request_hooks=None, timeout=None):
17+
"""
18+
Constructor for the TwilioHttpClient
19+
20+
:param bool pool_connections
21+
:param request_hooks
22+
:param int timeout: Timeout for the requests.
23+
Timeout should never be zero (0) or less.
24+
"""
1725
self.session = Session() if pool_connections else None
1826
self.last_request = None
1927
self.last_response = None
2028
self.request_hooks = request_hooks or hooks.default_hooks()
2129

30+
if timeout is not None and timeout <= 0:
31+
raise ValueError(timeout)
32+
self.timeout = timeout
33+
2234
def request(self, method, url, params=None, data=None, headers=None, auth=None, timeout=None,
2335
allow_redirects=False):
2436
"""
@@ -37,6 +49,8 @@ def request(self, method, url, params=None, data=None, headers=None, auth=None,
3749
:return: An http response
3850
:rtype: A :class:`Response <twilio.rest.http.response.Response>` object
3951
"""
52+
if timeout is not None and timeout <= 0:
53+
raise ValueError(timeout)
4054

4155
kwargs = {
4256
'method': method.upper(),
@@ -65,7 +79,7 @@ def request(self, method, url, params=None, data=None, headers=None, auth=None,
6579
response = session.send(
6680
prepped_request,
6781
allow_redirects=allow_redirects,
68-
timeout=timeout,
82+
timeout=timeout if timeout is not None else self.timeout,
6983
)
7084

7185
_logger.info('{method} Response: {status} {text}'.format(method=method, status=response.status_code, text=response.text))

0 commit comments

Comments
 (0)
0