|
6 | 6 | from __future__ import print_function
|
7 | 7 | from __future__ import unicode_literals
|
8 | 8 |
|
9 |
| -import time |
10 |
| -import random |
11 |
| - |
12 |
| -import json |
13 |
| -import struct |
14 | 9 | import datetime
|
| 10 | +import json |
| 11 | +import random |
15 | 12 | import socket
|
| 13 | +import struct |
| 14 | +import time |
| 15 | + |
16 | 16 | import msgpack
|
17 | 17 | import requests
|
18 | 18 | import requests.exceptions
|
@@ -281,10 +281,16 @@ def request(self, url, method='GET', params=None, data=None,
|
281 | 281 | if not retry:
|
282 | 282 | raise
|
283 | 283 |
|
| 284 | + content_type = response.headers and response.headers.get("Content-Type") |
| 285 | + if content_type == "application/x-msgpack" and response.content: |
| 286 | + response._msgpack = msgpack.unpackb( |
| 287 | + packed=response.content, |
| 288 | + ext_hook=_msgpack_parse_hook, |
| 289 | + raw=False) |
| 290 | + |
284 | 291 | def reformat_error(response):
|
285 |
| - err = self._parse_msgpack(response) |
286 |
| - if err: |
287 |
| - return json.dumps(err, separators=(',', ':')) |
| 292 | + if response._msgpack: |
| 293 | + return json.dumps(response._msgpack, separators=(',', ':')) |
288 | 294 | else:
|
289 | 295 | return response.content
|
290 | 296 |
|
@@ -354,21 +360,6 @@ def _read_chunked_response(response, raise_errors=True):
|
354 | 360 | _key, []).extend(result[_key])
|
355 | 361 | return ResultSet(result_set, raise_errors=raise_errors)
|
356 | 362 |
|
357 |
| - @staticmethod |
358 |
| - def _parse_msgpack(response): |
359 |
| - """Return the decoded response if it is encoded as msgpack.""" |
360 |
| - def hook(code, data): |
361 |
| - if code == 5: |
362 |
| - (epoch_s, epoch_ns) = struct.unpack(">QI", data) |
363 |
| - time = datetime.datetime.utcfromtimestamp(epoch_s) |
364 |
| - time += datetime.timedelta(microseconds=(epoch_ns / 1000)) |
365 |
| - return time.isoformat() + 'Z' |
366 |
| - return msgpack.ExtType(code, data) |
367 |
| - |
368 |
| - headers = response.headers |
369 |
| - if headers and headers["Content-Type"] == "application/x-msgpack": |
370 |
| - return msgpack.unpackb(response.content, ext_hook=hook, raw=False) |
371 |
| - |
372 | 363 | def query(self,
|
373 | 364 | query,
|
374 | 365 | params=None,
|
@@ -461,7 +452,7 @@ def query(self,
|
461 | 452 | expected_response_code=expected_response_code
|
462 | 453 | )
|
463 | 454 |
|
464 |
| - data = self._parse_msgpack(response) |
| 455 | + data = getattr(response, '_msgpack', None) |
465 | 456 | if not data:
|
466 | 457 | if chunked:
|
467 | 458 | return self._read_chunked_response(response)
|
@@ -1131,3 +1122,12 @@ def _parse_netloc(netloc):
|
1131 | 1122 | 'password': info.password or None,
|
1132 | 1123 | 'host': info.hostname or 'localhost',
|
1133 | 1124 | 'port': info.port or 8086}
|
| 1125 | + |
| 1126 | + |
| 1127 | +def _msgpack_parse_hook(code, data): |
| 1128 | + if code == 5: |
| 1129 | + (epoch_s, epoch_ns) = struct.unpack(">QI", data) |
| 1130 | + timestamp = datetime.datetime.utcfromtimestamp(epoch_s) |
| 1131 | + timestamp += datetime.timedelta(microseconds=(epoch_ns / 1000)) |
| 1132 | + return timestamp.isoformat() + 'Z' |
| 1133 | + return msgpack.ExtType(code, data) |
0 commit comments