Skip to content

Commit 70797c3

Browse files
Merge pull request #21 from georgeyk/support-timeout
Support timeout
2 parents 89f4162 + b012489 commit 70797c3

File tree

2 files changed

+23
-15
lines changed

2 files changed

+23
-15
lines changed

python_http_client/client.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,8 @@ def __init__(self,
6464
request_headers=None,
6565
version=None,
6666
url_path=None,
67-
append_slash=False):
67+
append_slash=False,
68+
timeout=None):
6869
"""
6970
:param host: Base URL for the api. (e.g. https://api.sendgrid.com)
7071
:type host: string
@@ -88,6 +89,7 @@ def __init__(self,
8889
self.methods = ['delete', 'get', 'patch', 'post', 'put']
8990
# APPEND SLASH set
9091
self.append_slash = append_slash
92+
self.timeout = timeout
9193

9294
def _build_versioned_url(self, url):
9395
"""Subclass this function for your own needs.
@@ -148,20 +150,24 @@ def _build_client(self, name=None):
148150
version=self._version,
149151
request_headers=self.request_headers,
150152
url_path=url_path,
151-
append_slash=self.append_slash)
153+
append_slash=self.append_slash,
154+
timeout=self.timeout)
152155

153-
def _make_request(self, opener, request):
156+
def _make_request(self, opener, request, timeout=None):
154157
"""Make the API call and return the response. This is separated into
155158
it's own function, so we can mock it easily for testing.
156159
157160
:param opener:
158161
:type opener:
159162
:param request: url payload to request
160163
:type request: urllib.Request object
164+
:param timeout: timeout value or None
165+
:type timeout: float
161166
:return: urllib response
162167
"""
168+
timeout = timeout or self.timeout
163169
try:
164-
return opener.open(request)
170+
return opener.open(request, timeout=timeout)
165171
except HTTPError as err:
166172
exc = handle_error(err)
167173
exc.__cause__ = None
@@ -241,7 +247,8 @@ def http_request(*_, **kwargs):
241247
if data and ('Content-Type' not in self.request_headers):
242248
request.add_header('Content-Type', 'application/json')
243249
request.get_method = lambda: method
244-
return Response(self._make_request(opener, request))
250+
timeout = kwargs.pop('timeout', None)
251+
return Response(self._make_request(opener, request, timeout=timeout))
245252
return http_request
246253
else:
247254
# Add a segment to the URL

tests/test_unit.py

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,12 @@ def read(self):
5858

5959
class MockClient(Client):
6060

61-
def __init__(self, host, response_code):
61+
def __init__(self, host, response_code, timeout=None):
6262
self.response_code = 200
6363
Client.__init__(self, host)
6464

65-
def _make_request(self, opener, request):
66-
67-
if 200 <= self.response_code < 299: # if successful code
65+
def _make_request(self, opener, request, timeout=None):
66+
if 200 <= self.response_code < 299: # if successsful code
6867
return MockResponse(self.response_code)
6968
else:
7069
raise handle_error(MockException(self.response_code))
@@ -74,12 +73,11 @@ class TestClient(unittest.TestCase):
7473

7574
def setUp(self):
7675
self.host = 'http://api.test.com'
77-
self.client = Client(host=self.host)
78-
self.api_key = 'SENDGRID_API_KEY'
76+
self.api_key = "SENDGRID_API_KEY"
7977
self.request_headers = {
80-
'Content-Type': 'application/json',
81-
'Authorization': 'Bearer ' + self.api_key
82-
}
78+
'Content-Type': 'application/json',
79+
'Authorization': 'Bearer ' + self.api_key,
80+
}
8381
self.client = Client(host=self.host,
8482
request_headers=self.request_headers,
8583
version=3)
@@ -88,6 +86,7 @@ def test__init__(self):
8886
default_client = Client(host=self.host)
8987
self.assertEqual(default_client.host, self.host)
9088
self.assertEqual(default_client.request_headers, {})
89+
self.assertIs(default_client.timeout, None)
9190
methods = ['delete', 'get', 'patch', 'post', 'put']
9291
self.assertEqual(default_client.methods, methods)
9392
self.assertEqual(default_client._version, None)
@@ -97,13 +96,15 @@ def test__init__(self):
9796
version = 3
9897
client = Client(host=self.host,
9998
request_headers=request_headers,
100-
version=version)
99+
version=version,
100+
timeout=10)
101101
self.assertEqual(client.host, self.host)
102102
self.assertEqual(client.request_headers, request_headers)
103103
methods = ['delete', 'get', 'patch', 'post', 'put']
104104
self.assertEqual(client.methods, methods)
105105
self.assertEqual(client._version, 3)
106106
self.assertEqual(client._url_path, [])
107+
self.assertEqual(client.timeout, 10)
107108

108109
def test__build_versioned_url(self):
109110
url = '/api_keys?hello=1&world=2'

0 commit comments

Comments
 (0)