Skip to content

Commit 749f22c

Browse files
committed
Adds explicit http_request args
1 parent fa72b74 commit 749f22c

File tree

2 files changed

+55
-35
lines changed

2 files changed

+55
-35
lines changed

python_http_client/client.py

Lines changed: 35 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
"""HTTP Client library"""
22
import json
3+
34
from .exceptions import handle_error
45

56
try:
@@ -211,44 +212,51 @@ def get_version(*args, **kwargs):
211212
if name in self.methods:
212213
method = name.upper()
213214

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

243252
opener = urllib.build_opener()
244-
request = urllib.Request(self._build_url(params), data=data)
245-
if self.request_headers:
246-
for key, value in self.request_headers.items():
247-
request.add_header(key, value)
248-
if data and ('Content-Type' not in self.request_headers):
249-
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+
)
250258
request.get_method = lambda: method
251-
timeout = kwargs.pop('timeout', None)
259+
252260
return Response(
253261
self._make_request(opener, request, timeout=timeout)
254262
)

tests/test_unit.py

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,20 @@
22
import unittest
33

44
from python_http_client.client import Client
5-
from python_http_client.exceptions import (
6-
handle_error,
7-
HTTPError,
8-
BadRequestsError,
9-
NotFoundError,
10-
UnsupportedMediaTypeError,
11-
ServiceUnavailableError
12-
)
5+
from python_http_client.exceptions import (BadRequestsError, HTTPError,
6+
NotFoundError,
7+
ServiceUnavailableError,
8+
UnsupportedMediaTypeError,
9+
handle_error)
1310

1411
try:
1512
# Python 3
1613
import urllib.request as urllib
14+
from unittest import mock
1715
except ImportError:
1816
# Python 2
1917
import urllib2 as urllib
18+
import mock
2019

2120
try:
2221
basestring
@@ -120,6 +119,19 @@ def test__build_url(self):
120119
built_url = self.client._build_url(query_params)
121120
self.assertEqual(built_url, url)
122121

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

0 commit comments

Comments
 (0)