Skip to content

Commit 20315da

Browse files
committed
Moves logic to Request initializer
1 parent 4a2a272 commit 20315da

File tree

2 files changed

+48
-31
lines changed

2 files changed

+48
-31
lines changed

python_http_client/client.py

Lines changed: 35 additions & 31 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 '{}/v{}{}'.format(self.host, str(self._version), url)
107+
return '{0}/v{1}{2}'.format(self.host, str(self._version), url)
108108

109109
def _build_url(self, query_params):
110110
"""Build the final URL to be passed to urllib
@@ -213,47 +213,51 @@ 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'] != \
231-
'application/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')
252-
request.get_method = lambda: method
253-
timeout = kwargs.pop('timeout', None)
254-
return Response(
255-
self._make_request(opener, request, timeout=timeout)
253+
request = urllib.Request(
254+
self._build_url(query_params),
255+
headers=self.request_headers,
256+
data=data,
256257
)
258+
request.get_method = lambda: method
259+
260+
return Response(self._make_request(opener, request, timeout=timeout))
257261
return http_request
258262
else:
259263
# Add a segment to the URL

tests/test_unit.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,19 @@ def test__build_url(self):
120120
built_url = self.client._build_url(query_params)
121121
self.assertEqual(built_url, url)
122122

123+
@mock.patch('python_http_client.client.Client._make_request')
124+
def test__urllib_headers(self, maker):
125+
self.client._update_headers({'X-test': 'Test'})
126+
self.client.get()
127+
request = maker.call_args[0][1]
128+
self.assertTrue('X-test' in request.headers)
129+
130+
@mock.patch('python_http_client.client.Client._make_request')
131+
def test__urllib_method(self, maker):
132+
self.client.delete()
133+
request = maker.call_args[0][1]
134+
self.assertEqual(request.get_method(), 'DELETE')
135+
123136
def test__update_headers(self):
124137
request_headers = {'X-Test': 'Test'}
125138
self.client._update_headers(request_headers)

0 commit comments

Comments
 (0)