|
1 | 1 | """HTTP Client library"""
|
2 | 2 | import json
|
| 3 | + |
3 | 4 | from .exceptions import handle_error
|
4 | 5 |
|
5 | 6 | try:
|
@@ -211,44 +212,51 @@ def get_version(*args, **kwargs):
|
211 | 212 | if name in self.methods:
|
212 | 213 | method = name.upper()
|
213 | 214 |
|
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 | + **_): |
215 | 221 | """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 |
217 | 232 | :param kwargs:
|
218 |
| - :return: Client object |
| 233 | + :return: Response object |
219 | 234 | """
|
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: |
223 | 239 | data = None
|
224 | 240 | else:
|
225 | 241 | # Don't serialize to a JSON formatted str
|
226 | 242 | # 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') |
234 | 247 | 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') |
242 | 251 |
|
243 | 252 | 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 | + ) |
250 | 258 | request.get_method = lambda: method
|
251 |
| - timeout = kwargs.pop('timeout', None) |
| 259 | + |
252 | 260 | return Response(
|
253 | 261 | self._make_request(opener, request, timeout=timeout)
|
254 | 262 | )
|
|
0 commit comments