Skip to content

Commit 7efbd60

Browse files
committed
Moves logic to Request initializer
1 parent 12aade6 commit 7efbd60

File tree

2 files changed

+53
-28
lines changed

2 files changed

+53
-28
lines changed

python_http_client/client.py

Lines changed: 34 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ def _build_versioned_url(self, url):
104104
:type url: string
105105
:return: string
106106
"""
107-
return '{0}/v{1}{2}'.format(self.host, str(self._version), url)
107+
return '{0}/v{1}{2}'.format(self.host, self._version, url)
108108

109109
def _build_url(self, query_params):
110110
"""Build the final URL to be passed to urllib
@@ -213,44 +213,50 @@ def get_version(*args, **kwargs):
213213
if name in self.methods:
214214
method = name.upper()
215215

216-
def http_request(*_, **kwargs):
216+
def http_request(
217+
request_body=None,
218+
query_params=None,
219+
request_headers=None,
220+
timeout=None,
221+
**_):
217222
"""Make the API call
218-
:param args: unused
223+
:param timeout: HTTP request timeout. Will be propagated to
224+
urllib client
225+
:type timeout: float
226+
:param request_headers: HTTP headers. Will be merged into
227+
current client object state
228+
:type request_headers: dict
229+
:param query_params: HTTP query parameters
230+
:type query_params: dict
231+
:param request_body: HTTP request body
232+
:type request_body: string or json-serializable object
219233
:param kwargs:
220-
:return: Client object
234+
:return: Response object
221235
"""
222-
if 'request_headers' in kwargs:
223-
self._update_headers(kwargs['request_headers'])
224-
if 'request_body' not in kwargs:
236+
if request_headers:
237+
self._update_headers(request_headers)
238+
239+
if request_body is None:
225240
data = None
226241
else:
227242
# Don't serialize to a JSON formatted str
228243
# if we don't have a JSON Content-Type
229-
if 'Content-Type' in self.request_headers:
230-
if self.request_headers['Content-Type'] != 'application\
231-
/json':
232-
data = kwargs['request_body'].encode('utf-8')
233-
else:
234-
data = json.dumps(
235-
kwargs['request_body']).encode('utf-8')
244+
if 'Content-Type' in self.request_headers and \
245+
self.request_headers['Content-Type'] != 'application/json':
246+
data = request_body.encode('utf-8')
236247
else:
237-
data = json.dumps(
238-
kwargs['request_body']).encode('utf-8')
239-
240-
if 'query_params' in kwargs:
241-
params = kwargs['query_params']
242-
else:
243-
params = None
248+
self.request_headers.setdefault(
249+
'Content-Type', 'application/json')
250+
data = json.dumps(request_body).encode('utf-8')
244251

245252
opener = urllib.build_opener()
246-
request = urllib.Request(self._build_url(params), data=data)
247-
if self.request_headers:
248-
for key, value in self.request_headers.items():
249-
request.add_header(key, value)
250-
if data and ('Content-Type' not in self.request_headers):
251-
request.add_header('Content-Type', 'application/json')
253+
request = urllib.Request(
254+
self._build_url(query_params),
255+
headers=self.request_headers,
256+
data=data,
257+
)
252258
request.get_method = lambda: method
253-
timeout = kwargs.pop('timeout', None)
259+
254260
return Response(self._make_request(opener, request, timeout=timeout))
255261
return http_request
256262
else:

tests/test_unit.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,12 @@
44
import unittest2 as unittest
55
except ImportError:
66
import unittest
7+
8+
try:
9+
import mock
10+
except ImportError:
11+
from unittest import mock
12+
713
from python_http_client.client import Client
814
from python_http_client.exceptions import (
915
handle_error,
@@ -123,6 +129,19 @@ def test__build_url(self):
123129
built_url = self.client._build_url(query_params)
124130
self.assertEqual(built_url, url)
125131

132+
@mock.patch('python_http_client.client.Client._make_request')
133+
def test__urllib_headers(self, maker):
134+
self.client._update_headers({'X-test': 'Test'})
135+
self.client.get()
136+
request = maker.call_args[0][1]
137+
self.assertTrue('X-test' in request.headers)
138+
139+
@mock.patch('python_http_client.client.Client._make_request')
140+
def test__urllib_method(self, maker):
141+
self.client.delete()
142+
request = maker.call_args[0][1]
143+
self.assertEqual(request.get_method(), 'DELETE')
144+
126145
def test__update_headers(self):
127146
request_headers = {'X-Test': 'Test'}
128147
self.client._update_headers(request_headers)

0 commit comments

Comments
 (0)