Browse Source

Update MsgPack 0.5.6 (d4675be) → 0.6.0 (197e307).

pull/1200/head
JackDandy 7 years ago
parent
commit
3191bf3484
  1. 1
      CHANGES.md
  2. 3
      lib/msgpack/__init__.py
  3. 2
      lib/msgpack/_version.py
  4. 45
      lib/msgpack/exceptions.py
  5. 293
      lib/msgpack/fallback.py

1
CHANGES.md

@ -4,6 +4,7 @@
* Update Certifi 2018.08.24 (8be9f89) to 2018.10.15 (a462d21) * Update Certifi 2018.08.24 (8be9f89) to 2018.10.15 (a462d21)
* Update dateutil 2.7.2 (49690ee) to 2.7.5 (e954819) * Update dateutil 2.7.2 (49690ee) to 2.7.5 (e954819)
* Update html5lib 1.1-dev (e9ef538) to 1.1-dev (4f92357) * Update html5lib 1.1-dev (e9ef538) to 1.1-dev (4f92357)
* Update MsgPack 0.5.6 (d4675be) to 0.6.0 (197e307)
* Update Requests library 2.19.1 (2c6a842) to 2.20.1 (57d7284) * Update Requests library 2.19.1 (2c6a842) to 2.20.1 (57d7284)
* Update Six compatibility library 1.11.0 (68112f3) to 1.11.0 (0b4265e) * Update Six compatibility library 1.11.0 (68112f3) to 1.11.0 (0b4265e)
* Update urllib3 release 1.23 (7c216f4) to 1.24.1 (a6ec68a) * Update urllib3 release 1.23 (7c216f4) to 1.24.1 (a6ec68a)

3
lib/msgpack/__init__.py

@ -22,8 +22,7 @@ if os.environ.get('MSGPACK_PUREPYTHON'):
from msgpack.fallback import Packer, unpackb, Unpacker from msgpack.fallback import Packer, unpackb, Unpacker
else: else:
try: try:
from msgpack._packer import Packer from msgpack._cmsgpack import Packer, unpackb, Unpacker
from msgpack._unpacker import unpackb, Unpacker
except ImportError: except ImportError:
from msgpack.fallback import Packer, unpackb, Unpacker from msgpack.fallback import Packer, unpackb, Unpacker

2
lib/msgpack/_version.py

@ -1 +1 @@
version = (0, 5, 6) version = (0, 6, 0)

45
lib/msgpack/exceptions.py

@ -1,5 +1,10 @@
class UnpackException(Exception): class UnpackException(Exception):
"""Deprecated. Use Exception instead to catch all exception during unpacking.""" """Base class for some exceptions raised while unpacking.
NOTE: unpack may raise exception other than subclass of
UnpackException. If you want to catch all error, catch
Exception instead.
"""
class BufferFull(UnpackException): class BufferFull(UnpackException):
@ -10,32 +15,34 @@ class OutOfData(UnpackException):
pass pass
class UnpackValueError(UnpackException, ValueError): class FormatError(ValueError, UnpackException):
"""Deprecated. Use ValueError instead.""" """Invalid msgpack format"""
class ExtraData(UnpackValueError): class StackError(ValueError, UnpackException):
def __init__(self, unpacked, extra): """Too nested"""
self.unpacked = unpacked
self.extra = extra
def __str__(self):
return "unpack(b) received extra data."
class PackException(Exception): # Deprecated. Use ValueError instead
"""Deprecated. Use Exception instead to catch all exception during packing.""" UnpackValueError = ValueError
class PackValueError(PackException, ValueError): class ExtraData(UnpackValueError):
"""PackValueError is raised when type of input data is supported but it's value is unsupported. """ExtraData is raised when there is trailing data.
Deprecated. Use ValueError instead. This exception is raised while only one-shot (not streaming)
unpack.
""" """
def __init__(self, unpacked, extra):
self.unpacked = unpacked
self.extra = extra
def __str__(self):
return "unpack(b) received extra data."
class PackOverflowError(PackValueError, OverflowError):
"""PackOverflowError is raised when integer value is out of range of msgpack support [-2**31, 2**32).
Deprecated. Use ValueError instead. # Deprecated. Use Exception instead to catch all exception during packing.
""" PackException = Exception
PackValueError = ValueError
PackOverflowError = OverflowError

293
lib/msgpack/fallback.py

@ -4,20 +4,30 @@ import sys
import struct import struct
import warnings import warnings
if sys.version_info[0] == 3:
PY3 = True if sys.version_info[0] == 2:
PY2 = True
int_types = (int, long)
def dict_iteritems(d):
return d.iteritems()
else:
PY2 = False
int_types = int int_types = int
Unicode = str unicode = str
xrange = range xrange = range
def dict_iteritems(d): def dict_iteritems(d):
return d.items() return d.items()
else:
PY3 = False
int_types = (int, long)
Unicode = unicode
def dict_iteritems(d):
return d.iteritems()
if sys.version_info < (3, 5):
# Ugly hack...
RecursionError = RuntimeError
def _is_recursionerror(e):
return len(e.args) == 1 and isinstance(e.args[0], str) and \
e.args[0].startswith('maximum recursion depth exceeded')
else:
def _is_recursionerror(e):
return True
if hasattr(sys, 'pypy_version_info'): if hasattr(sys, 'pypy_version_info'):
# cStringIO is slow on PyPy, StringIO is faster. However: PyPy's own # cStringIO is slow on PyPy, StringIO is faster. However: PyPy's own
@ -52,10 +62,10 @@ else:
from msgpack.exceptions import ( from msgpack.exceptions import (
BufferFull, BufferFull,
OutOfData, OutOfData,
UnpackValueError, ExtraData,
PackValueError, FormatError,
PackOverflowError, StackError,
ExtraData) )
from msgpack import ExtType from msgpack import ExtType
@ -87,12 +97,12 @@ def _get_data_from_buffer(obj):
view = memoryview(obj) view = memoryview(obj)
except TypeError: except TypeError:
# try to use legacy buffer protocol if 2.7, otherwise re-raise # try to use legacy buffer protocol if 2.7, otherwise re-raise
if not PY3: if PY2:
view = memoryview(buffer(obj)) view = memoryview(buffer(obj))
warnings.warn("using old buffer interface to unpack %s; " warnings.warn("using old buffer interface to unpack %s; "
"this leads to unpacking errors if slicing is used and " "this leads to unpacking errors if slicing is used and "
"will be removed in a future version" % type(obj), "will be removed in a future version" % type(obj),
RuntimeWarning) RuntimeWarning, stacklevel=3)
else: else:
raise raise
if view.itemsize != 1: if view.itemsize != 1:
@ -103,7 +113,7 @@ def _get_data_from_buffer(obj):
def unpack(stream, **kwargs): def unpack(stream, **kwargs):
warnings.warn( warnings.warn(
"Direct calling implementation's unpack() is deprecated, Use msgpack.unpack() or unpackb() instead.", "Direct calling implementation's unpack() is deprecated, Use msgpack.unpack() or unpackb() instead.",
PendingDeprecationWarning) DeprecationWarning, stacklevel=2)
data = stream.read() data = stream.read()
return unpackb(data, **kwargs) return unpackb(data, **kwargs)
@ -112,7 +122,12 @@ def unpackb(packed, **kwargs):
""" """
Unpack an object from `packed`. Unpack an object from `packed`.
Raises `ExtraData` when `packed` contains extra bytes. Raises ``ExtraData`` when *packed* contains extra bytes.
Raises ``ValueError`` when *packed* is incomplete.
Raises ``FormatError`` when *packed* is not valid msgpack.
Raises ``StackError`` when *packed* contains too nested.
Other exceptions can be raised during unpacking.
See :class:`Unpacker` for options. See :class:`Unpacker` for options.
""" """
unpacker = Unpacker(None, **kwargs) unpacker = Unpacker(None, **kwargs)
@ -120,12 +135,24 @@ def unpackb(packed, **kwargs):
try: try:
ret = unpacker._unpack() ret = unpacker._unpack()
except OutOfData: except OutOfData:
raise UnpackValueError("Data is not enough.") raise ValueError("Unpack failed: incomplete input")
except RecursionError as e:
if _is_recursionerror(e):
raise StackError
raise
if unpacker._got_extradata(): if unpacker._got_extradata():
raise ExtraData(ret, unpacker._get_extradata()) raise ExtraData(ret, unpacker._get_extradata())
return ret return ret
if sys.version_info < (2, 7, 6):
def _unpack_from(f, b, o=0):
"""Explicit typcast for legacy struct.unpack_from"""
return struct.unpack_from(f, bytes(b), o)
else:
_unpack_from = struct.unpack_from
class Unpacker(object): class Unpacker(object):
"""Streaming unpacker. """Streaming unpacker.
@ -152,6 +179,11 @@ class Unpacker(object):
*encoding* option which is deprecated overrides this option. *encoding* option which is deprecated overrides this option.
:param bool strict_map_key:
If true, only str or bytes are accepted for map (dict) keys.
It's False by default for backward-compatibility.
But it will be True from msgpack 1.0.
:param callable object_hook: :param callable object_hook:
When specified, it should be callable. When specified, it should be callable.
Unpacker calls it with a dict argument after unpacking msgpack map. Unpacker calls it with a dict argument after unpacking msgpack map.
@ -176,17 +208,19 @@ class Unpacker(object):
You should set this parameter when unpacking data from untrusted source. You should set this parameter when unpacking data from untrusted source.
:param int max_str_len: :param int max_str_len:
Limits max length of str. (default: 2**31-1) Limits max length of str. (default: 1024*1024)
:param int max_bin_len: :param int max_bin_len:
Limits max length of bin. (default: 2**31-1) Limits max length of bin. (default: 1024*1024)
:param int max_array_len: :param int max_array_len:
Limits max length of array. (default: 2**31-1) Limits max length of array. (default: 128*1024)
:param int max_map_len: :param int max_map_len:
Limits max length of map. (default: 2**31-1) Limits max length of map. (default: 32*1024)
:param int max_ext_len:
Limits max size of ext type. (default: 1024*1024)
example of streaming deserialize from file-like object:: example of streaming deserialize from file-like object::
@ -204,22 +238,28 @@ class Unpacker(object):
unpacker.feed(buf) unpacker.feed(buf)
for o in unpacker: for o in unpacker:
process(o) process(o)
Raises ``ExtraData`` when *packed* contains extra bytes.
Raises ``OutOfData`` when *packed* is incomplete.
Raises ``FormatError`` when *packed* is not valid msgpack.
Raises ``StackError`` when *packed* contains too nested.
Other exceptions can be raised during unpacking.
""" """
def __init__(self, file_like=None, read_size=0, use_list=True, raw=True, def __init__(self, file_like=None, read_size=0, use_list=True, raw=True, strict_map_key=False,
object_hook=None, object_pairs_hook=None, list_hook=None, object_hook=None, object_pairs_hook=None, list_hook=None,
encoding=None, unicode_errors=None, max_buffer_size=0, encoding=None, unicode_errors=None, max_buffer_size=0,
ext_hook=ExtType, ext_hook=ExtType,
max_str_len=2147483647, # 2**32-1 max_str_len=1024*1024,
max_bin_len=2147483647, max_bin_len=1024*1024,
max_array_len=2147483647, max_array_len=128*1024,
max_map_len=2147483647, max_map_len=32*1024,
max_ext_len=2147483647): max_ext_len=1024*1024):
if encoding is not None: if encoding is not None:
warnings.warn( warnings.warn(
"encoding is deprecated, Use raw=False instead.", "encoding is deprecated, Use raw=False instead.",
PendingDeprecationWarning) DeprecationWarning, stacklevel=2)
if unicode_errors is None: if unicode_errors is None:
unicode_errors = 'strict' unicode_errors = 'strict'
@ -251,6 +291,7 @@ class Unpacker(object):
raise ValueError("read_size must be smaller than max_buffer_size") raise ValueError("read_size must be smaller than max_buffer_size")
self._read_size = read_size or min(self._max_buffer_size, 16*1024) self._read_size = read_size or min(self._max_buffer_size, 16*1024)
self._raw = bool(raw) self._raw = bool(raw)
self._strict_map_key = bool(strict_map_key)
self._encoding = encoding self._encoding = encoding
self._unicode_errors = unicode_errors self._unicode_errors = unicode_errors
self._use_list = use_list self._use_list = use_list
@ -289,7 +330,8 @@ class Unpacker(object):
self._buff_i -= self._buf_checkpoint self._buff_i -= self._buf_checkpoint
self._buf_checkpoint = 0 self._buf_checkpoint = 0
self._buffer += view # Use extend here: INPLACE_ADD += doesn't reliably typecast memoryview in jython
self._buffer.extend(view)
def _consume(self): def _consume(self):
""" Gets rid of the used parts of the buffer. """ """ Gets rid of the used parts of the buffer. """
@ -359,18 +401,18 @@ class Unpacker(object):
n = b & 0b00011111 n = b & 0b00011111
typ = TYPE_RAW typ = TYPE_RAW
if n > self._max_str_len: if n > self._max_str_len:
raise UnpackValueError("%s exceeds max_str_len(%s)", n, self._max_str_len) raise ValueError("%s exceeds max_str_len(%s)", n, self._max_str_len)
obj = self._read(n) obj = self._read(n)
elif b & 0b11110000 == 0b10010000: elif b & 0b11110000 == 0b10010000:
n = b & 0b00001111 n = b & 0b00001111
typ = TYPE_ARRAY typ = TYPE_ARRAY
if n > self._max_array_len: if n > self._max_array_len:
raise UnpackValueError("%s exceeds max_array_len(%s)", n, self._max_array_len) raise ValueError("%s exceeds max_array_len(%s)", n, self._max_array_len)
elif b & 0b11110000 == 0b10000000: elif b & 0b11110000 == 0b10000000:
n = b & 0b00001111 n = b & 0b00001111
typ = TYPE_MAP typ = TYPE_MAP
if n > self._max_map_len: if n > self._max_map_len:
raise UnpackValueError("%s exceeds max_map_len(%s)", n, self._max_map_len) raise ValueError("%s exceeds max_map_len(%s)", n, self._max_map_len)
elif b == 0xc0: elif b == 0xc0:
obj = None obj = None
elif b == 0xc2: elif b == 0xc2:
@ -383,55 +425,55 @@ class Unpacker(object):
n = self._buffer[self._buff_i] n = self._buffer[self._buff_i]
self._buff_i += 1 self._buff_i += 1
if n > self._max_bin_len: if n > self._max_bin_len:
raise UnpackValueError("%s exceeds max_bin_len(%s)" % (n, self._max_bin_len)) raise ValueError("%s exceeds max_bin_len(%s)" % (n, self._max_bin_len))
obj = self._read(n) obj = self._read(n)
elif b == 0xc5: elif b == 0xc5:
typ = TYPE_BIN typ = TYPE_BIN
self._reserve(2) self._reserve(2)
n = struct.unpack_from(">H", self._buffer, self._buff_i)[0] n = _unpack_from(">H", self._buffer, self._buff_i)[0]
self._buff_i += 2 self._buff_i += 2
if n > self._max_bin_len: if n > self._max_bin_len:
raise UnpackValueError("%s exceeds max_bin_len(%s)" % (n, self._max_bin_len)) raise ValueError("%s exceeds max_bin_len(%s)" % (n, self._max_bin_len))
obj = self._read(n) obj = self._read(n)
elif b == 0xc6: elif b == 0xc6:
typ = TYPE_BIN typ = TYPE_BIN
self._reserve(4) self._reserve(4)
n = struct.unpack_from(">I", self._buffer, self._buff_i)[0] n = _unpack_from(">I", self._buffer, self._buff_i)[0]
self._buff_i += 4 self._buff_i += 4
if n > self._max_bin_len: if n > self._max_bin_len:
raise UnpackValueError("%s exceeds max_bin_len(%s)" % (n, self._max_bin_len)) raise ValueError("%s exceeds max_bin_len(%s)" % (n, self._max_bin_len))
obj = self._read(n) obj = self._read(n)
elif b == 0xc7: # ext 8 elif b == 0xc7: # ext 8
typ = TYPE_EXT typ = TYPE_EXT
self._reserve(2) self._reserve(2)
L, n = struct.unpack_from('Bb', self._buffer, self._buff_i) L, n = _unpack_from('Bb', self._buffer, self._buff_i)
self._buff_i += 2 self._buff_i += 2
if L > self._max_ext_len: if L > self._max_ext_len:
raise UnpackValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len)) raise ValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len))
obj = self._read(L) obj = self._read(L)
elif b == 0xc8: # ext 16 elif b == 0xc8: # ext 16
typ = TYPE_EXT typ = TYPE_EXT
self._reserve(3) self._reserve(3)
L, n = struct.unpack_from('>Hb', self._buffer, self._buff_i) L, n = _unpack_from('>Hb', self._buffer, self._buff_i)
self._buff_i += 3 self._buff_i += 3
if L > self._max_ext_len: if L > self._max_ext_len:
raise UnpackValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len)) raise ValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len))
obj = self._read(L) obj = self._read(L)
elif b == 0xc9: # ext 32 elif b == 0xc9: # ext 32
typ = TYPE_EXT typ = TYPE_EXT
self._reserve(5) self._reserve(5)
L, n = struct.unpack_from('>Ib', self._buffer, self._buff_i) L, n = _unpack_from('>Ib', self._buffer, self._buff_i)
self._buff_i += 5 self._buff_i += 5
if L > self._max_ext_len: if L > self._max_ext_len:
raise UnpackValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len)) raise ValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len))
obj = self._read(L) obj = self._read(L)
elif b == 0xca: elif b == 0xca:
self._reserve(4) self._reserve(4)
obj = struct.unpack_from(">f", self._buffer, self._buff_i)[0] obj = _unpack_from(">f", self._buffer, self._buff_i)[0]
self._buff_i += 4 self._buff_i += 4
elif b == 0xcb: elif b == 0xcb:
self._reserve(8) self._reserve(8)
obj = struct.unpack_from(">d", self._buffer, self._buff_i)[0] obj = _unpack_from(">d", self._buffer, self._buff_i)[0]
self._buff_i += 8 self._buff_i += 8
elif b == 0xcc: elif b == 0xcc:
self._reserve(1) self._reserve(1)
@ -439,66 +481,66 @@ class Unpacker(object):
self._buff_i += 1 self._buff_i += 1
elif b == 0xcd: elif b == 0xcd:
self._reserve(2) self._reserve(2)
obj = struct.unpack_from(">H", self._buffer, self._buff_i)[0] obj = _unpack_from(">H", self._buffer, self._buff_i)[0]
self._buff_i += 2 self._buff_i += 2
elif b == 0xce: elif b == 0xce:
self._reserve(4) self._reserve(4)
obj = struct.unpack_from(">I", self._buffer, self._buff_i)[0] obj = _unpack_from(">I", self._buffer, self._buff_i)[0]
self._buff_i += 4 self._buff_i += 4
elif b == 0xcf: elif b == 0xcf:
self._reserve(8) self._reserve(8)
obj = struct.unpack_from(">Q", self._buffer, self._buff_i)[0] obj = _unpack_from(">Q", self._buffer, self._buff_i)[0]
self._buff_i += 8 self._buff_i += 8
elif b == 0xd0: elif b == 0xd0:
self._reserve(1) self._reserve(1)
obj = struct.unpack_from("b", self._buffer, self._buff_i)[0] obj = _unpack_from("b", self._buffer, self._buff_i)[0]
self._buff_i += 1 self._buff_i += 1
elif b == 0xd1: elif b == 0xd1:
self._reserve(2) self._reserve(2)
obj = struct.unpack_from(">h", self._buffer, self._buff_i)[0] obj = _unpack_from(">h", self._buffer, self._buff_i)[0]
self._buff_i += 2 self._buff_i += 2
elif b == 0xd2: elif b == 0xd2:
self._reserve(4) self._reserve(4)
obj = struct.unpack_from(">i", self._buffer, self._buff_i)[0] obj = _unpack_from(">i", self._buffer, self._buff_i)[0]
self._buff_i += 4 self._buff_i += 4
elif b == 0xd3: elif b == 0xd3:
self._reserve(8) self._reserve(8)
obj = struct.unpack_from(">q", self._buffer, self._buff_i)[0] obj = _unpack_from(">q", self._buffer, self._buff_i)[0]
self._buff_i += 8 self._buff_i += 8
elif b == 0xd4: # fixext 1 elif b == 0xd4: # fixext 1
typ = TYPE_EXT typ = TYPE_EXT
if self._max_ext_len < 1: if self._max_ext_len < 1:
raise UnpackValueError("%s exceeds max_ext_len(%s)" % (1, self._max_ext_len)) raise ValueError("%s exceeds max_ext_len(%s)" % (1, self._max_ext_len))
self._reserve(2) self._reserve(2)
n, obj = struct.unpack_from("b1s", self._buffer, self._buff_i) n, obj = _unpack_from("b1s", self._buffer, self._buff_i)
self._buff_i += 2 self._buff_i += 2
elif b == 0xd5: # fixext 2 elif b == 0xd5: # fixext 2
typ = TYPE_EXT typ = TYPE_EXT
if self._max_ext_len < 2: if self._max_ext_len < 2:
raise UnpackValueError("%s exceeds max_ext_len(%s)" % (2, self._max_ext_len)) raise ValueError("%s exceeds max_ext_len(%s)" % (2, self._max_ext_len))
self._reserve(3) self._reserve(3)
n, obj = struct.unpack_from("b2s", self._buffer, self._buff_i) n, obj = _unpack_from("b2s", self._buffer, self._buff_i)
self._buff_i += 3 self._buff_i += 3
elif b == 0xd6: # fixext 4 elif b == 0xd6: # fixext 4
typ = TYPE_EXT typ = TYPE_EXT
if self._max_ext_len < 4: if self._max_ext_len < 4:
raise UnpackValueError("%s exceeds max_ext_len(%s)" % (4, self._max_ext_len)) raise ValueError("%s exceeds max_ext_len(%s)" % (4, self._max_ext_len))
self._reserve(5) self._reserve(5)
n, obj = struct.unpack_from("b4s", self._buffer, self._buff_i) n, obj = _unpack_from("b4s", self._buffer, self._buff_i)
self._buff_i += 5 self._buff_i += 5
elif b == 0xd7: # fixext 8 elif b == 0xd7: # fixext 8
typ = TYPE_EXT typ = TYPE_EXT
if self._max_ext_len < 8: if self._max_ext_len < 8:
raise UnpackValueError("%s exceeds max_ext_len(%s)" % (8, self._max_ext_len)) raise ValueError("%s exceeds max_ext_len(%s)" % (8, self._max_ext_len))
self._reserve(9) self._reserve(9)
n, obj = struct.unpack_from("b8s", self._buffer, self._buff_i) n, obj = _unpack_from("b8s", self._buffer, self._buff_i)
self._buff_i += 9 self._buff_i += 9
elif b == 0xd8: # fixext 16 elif b == 0xd8: # fixext 16
typ = TYPE_EXT typ = TYPE_EXT
if self._max_ext_len < 16: if self._max_ext_len < 16:
raise UnpackValueError("%s exceeds max_ext_len(%s)" % (16, self._max_ext_len)) raise ValueError("%s exceeds max_ext_len(%s)" % (16, self._max_ext_len))
self._reserve(17) self._reserve(17)
n, obj = struct.unpack_from("b16s", self._buffer, self._buff_i) n, obj = _unpack_from("b16s", self._buffer, self._buff_i)
self._buff_i += 17 self._buff_i += 17
elif b == 0xd9: elif b == 0xd9:
typ = TYPE_RAW typ = TYPE_RAW
@ -506,54 +548,54 @@ class Unpacker(object):
n = self._buffer[self._buff_i] n = self._buffer[self._buff_i]
self._buff_i += 1 self._buff_i += 1
if n > self._max_str_len: if n > self._max_str_len:
raise UnpackValueError("%s exceeds max_str_len(%s)", n, self._max_str_len) raise ValueError("%s exceeds max_str_len(%s)", n, self._max_str_len)
obj = self._read(n) obj = self._read(n)
elif b == 0xda: elif b == 0xda:
typ = TYPE_RAW typ = TYPE_RAW
self._reserve(2) self._reserve(2)
n, = struct.unpack_from(">H", self._buffer, self._buff_i) n, = _unpack_from(">H", self._buffer, self._buff_i)
self._buff_i += 2 self._buff_i += 2
if n > self._max_str_len: if n > self._max_str_len:
raise UnpackValueError("%s exceeds max_str_len(%s)", n, self._max_str_len) raise ValueError("%s exceeds max_str_len(%s)", n, self._max_str_len)
obj = self._read(n) obj = self._read(n)
elif b == 0xdb: elif b == 0xdb:
typ = TYPE_RAW typ = TYPE_RAW
self._reserve(4) self._reserve(4)
n, = struct.unpack_from(">I", self._buffer, self._buff_i) n, = _unpack_from(">I", self._buffer, self._buff_i)
self._buff_i += 4 self._buff_i += 4
if n > self._max_str_len: if n > self._max_str_len:
raise UnpackValueError("%s exceeds max_str_len(%s)", n, self._max_str_len) raise ValueError("%s exceeds max_str_len(%s)", n, self._max_str_len)
obj = self._read(n) obj = self._read(n)
elif b == 0xdc: elif b == 0xdc:
typ = TYPE_ARRAY typ = TYPE_ARRAY
self._reserve(2) self._reserve(2)
n, = struct.unpack_from(">H", self._buffer, self._buff_i) n, = _unpack_from(">H", self._buffer, self._buff_i)
self._buff_i += 2 self._buff_i += 2
if n > self._max_array_len: if n > self._max_array_len:
raise UnpackValueError("%s exceeds max_array_len(%s)", n, self._max_array_len) raise ValueError("%s exceeds max_array_len(%s)", n, self._max_array_len)
elif b == 0xdd: elif b == 0xdd:
typ = TYPE_ARRAY typ = TYPE_ARRAY
self._reserve(4) self._reserve(4)
n, = struct.unpack_from(">I", self._buffer, self._buff_i) n, = _unpack_from(">I", self._buffer, self._buff_i)
self._buff_i += 4 self._buff_i += 4
if n > self._max_array_len: if n > self._max_array_len:
raise UnpackValueError("%s exceeds max_array_len(%s)", n, self._max_array_len) raise ValueError("%s exceeds max_array_len(%s)", n, self._max_array_len)
elif b == 0xde: elif b == 0xde:
self._reserve(2) self._reserve(2)
n, = struct.unpack_from(">H", self._buffer, self._buff_i) n, = _unpack_from(">H", self._buffer, self._buff_i)
self._buff_i += 2 self._buff_i += 2
if n > self._max_map_len: if n > self._max_map_len:
raise UnpackValueError("%s exceeds max_map_len(%s)", n, self._max_map_len) raise ValueError("%s exceeds max_map_len(%s)", n, self._max_map_len)
typ = TYPE_MAP typ = TYPE_MAP
elif b == 0xdf: elif b == 0xdf:
self._reserve(4) self._reserve(4)
n, = struct.unpack_from(">I", self._buffer, self._buff_i) n, = _unpack_from(">I", self._buffer, self._buff_i)
self._buff_i += 4 self._buff_i += 4
if n > self._max_map_len: if n > self._max_map_len:
raise UnpackValueError("%s exceeds max_map_len(%s)", n, self._max_map_len) raise ValueError("%s exceeds max_map_len(%s)", n, self._max_map_len)
typ = TYPE_MAP typ = TYPE_MAP
else: else:
raise UnpackValueError("Unknown header: 0x%x" % b) raise FormatError("Unknown header: 0x%x" % b)
return typ, n, obj return typ, n, obj
def _unpack(self, execute=EX_CONSTRUCT): def _unpack(self, execute=EX_CONSTRUCT):
@ -561,11 +603,11 @@ class Unpacker(object):
if execute == EX_READ_ARRAY_HEADER: if execute == EX_READ_ARRAY_HEADER:
if typ != TYPE_ARRAY: if typ != TYPE_ARRAY:
raise UnpackValueError("Expected array") raise ValueError("Expected array")
return n return n
if execute == EX_READ_MAP_HEADER: if execute == EX_READ_MAP_HEADER:
if typ != TYPE_MAP: if typ != TYPE_MAP:
raise UnpackValueError("Expected map") raise ValueError("Expected map")
return n return n
# TODO should we eliminate the recursion? # TODO should we eliminate the recursion?
if typ == TYPE_ARRAY: if typ == TYPE_ARRAY:
@ -597,6 +639,8 @@ class Unpacker(object):
ret = {} ret = {}
for _ in xrange(n): for _ in xrange(n):
key = self._unpack(EX_CONSTRUCT) key = self._unpack(EX_CONSTRUCT)
if self._strict_map_key and type(key) not in (unicode, bytes):
raise ValueError("%s is not allowed for map key" % str(type(key)))
ret[key] = self._unpack(EX_CONSTRUCT) ret[key] = self._unpack(EX_CONSTRUCT)
if self._object_hook is not None: if self._object_hook is not None:
ret = self._object_hook(ret) ret = self._object_hook(ret)
@ -629,37 +673,30 @@ class Unpacker(object):
except OutOfData: except OutOfData:
self._consume() self._consume()
raise StopIteration raise StopIteration
except RecursionError:
raise StackError
next = __next__ next = __next__
def skip(self, write_bytes=None): def skip(self):
self._unpack(EX_SKIP) self._unpack(EX_SKIP)
if write_bytes is not None:
warnings.warn("`write_bytes` option is deprecated. Use `.tell()` instead.", DeprecationWarning)
write_bytes(self._buffer[self._buf_checkpoint:self._buff_i])
self._consume() self._consume()
def unpack(self, write_bytes=None): def unpack(self):
ret = self._unpack(EX_CONSTRUCT) try:
if write_bytes is not None: ret = self._unpack(EX_CONSTRUCT)
warnings.warn("`write_bytes` option is deprecated. Use `.tell()` instead.", DeprecationWarning) except RecursionError:
write_bytes(self._buffer[self._buf_checkpoint:self._buff_i]) raise StackError
self._consume() self._consume()
return ret return ret
def read_array_header(self, write_bytes=None): def read_array_header(self):
ret = self._unpack(EX_READ_ARRAY_HEADER) ret = self._unpack(EX_READ_ARRAY_HEADER)
if write_bytes is not None:
warnings.warn("`write_bytes` option is deprecated. Use `.tell()` instead.", DeprecationWarning)
write_bytes(self._buffer[self._buf_checkpoint:self._buff_i])
self._consume() self._consume()
return ret return ret
def read_map_header(self, write_bytes=None): def read_map_header(self):
ret = self._unpack(EX_READ_MAP_HEADER) ret = self._unpack(EX_READ_MAP_HEADER)
if write_bytes is not None:
warnings.warn("`write_bytes` option is deprecated. Use `.tell()` instead.", DeprecationWarning)
write_bytes(self._buffer[self._buf_checkpoint:self._buff_i])
self._consume() self._consume()
return ret return ret
@ -716,7 +753,7 @@ class Packer(object):
else: else:
warnings.warn( warnings.warn(
"encoding is deprecated, Use raw=False instead.", "encoding is deprecated, Use raw=False instead.",
PendingDeprecationWarning) DeprecationWarning, stacklevel=2)
if unicode_errors is None: if unicode_errors is None:
unicode_errors = 'strict' unicode_errors = 'strict'
@ -743,7 +780,7 @@ class Packer(object):
list_types = (list, tuple) list_types = (list, tuple)
while True: while True:
if nest_limit < 0: if nest_limit < 0:
raise PackValueError("recursion limit exceeded") raise ValueError("recursion limit exceeded")
if obj is None: if obj is None:
return self._buffer.write(b"\xc0") return self._buffer.write(b"\xc0")
if check(obj, bool): if check(obj, bool):
@ -775,14 +812,14 @@ class Packer(object):
obj = self._default(obj) obj = self._default(obj)
default_used = True default_used = True
continue continue
raise PackOverflowError("Integer value out of range") raise OverflowError("Integer value out of range")
if check(obj, (bytes, bytearray)): if check(obj, (bytes, bytearray)):
n = len(obj) n = len(obj)
if n >= 2**32: if n >= 2**32:
raise PackValueError("%s is too large" % type(obj).__name__) raise ValueError("%s is too large" % type(obj).__name__)
self._pack_bin_header(n) self._pack_bin_header(n)
return self._buffer.write(obj) return self._buffer.write(obj)
if check(obj, Unicode): if check(obj, unicode):
if self._encoding is None: if self._encoding is None:
raise TypeError( raise TypeError(
"Can't encode unicode string: " "Can't encode unicode string: "
@ -790,13 +827,13 @@ class Packer(object):
obj = obj.encode(self._encoding, self._unicode_errors) obj = obj.encode(self._encoding, self._unicode_errors)
n = len(obj) n = len(obj)
if n >= 2**32: if n >= 2**32:
raise PackValueError("String is too large") raise ValueError("String is too large")
self._pack_raw_header(n) self._pack_raw_header(n)
return self._buffer.write(obj) return self._buffer.write(obj)
if check(obj, memoryview): if check(obj, memoryview):
n = len(obj) * obj.itemsize n = len(obj) * obj.itemsize
if n >= 2**32: if n >= 2**32:
raise PackValueError("Memoryview is too large") raise ValueError("Memoryview is too large")
self._pack_bin_header(n) self._pack_bin_header(n)
return self._buffer.write(obj) return self._buffer.write(obj)
if check(obj, float): if check(obj, float):
@ -849,43 +886,35 @@ class Packer(object):
except: except:
self._buffer = StringIO() # force reset self._buffer = StringIO() # force reset
raise raise
ret = self._buffer.getvalue()
if self._autoreset: if self._autoreset:
ret = self._buffer.getvalue()
self._buffer = StringIO() self._buffer = StringIO()
elif USING_STRINGBUILDER: return ret
self._buffer = StringIO(ret)
return ret
def pack_map_pairs(self, pairs): def pack_map_pairs(self, pairs):
self._pack_map_pairs(len(pairs), pairs) self._pack_map_pairs(len(pairs), pairs)
ret = self._buffer.getvalue()
if self._autoreset: if self._autoreset:
ret = self._buffer.getvalue()
self._buffer = StringIO() self._buffer = StringIO()
elif USING_STRINGBUILDER: return ret
self._buffer = StringIO(ret)
return ret
def pack_array_header(self, n): def pack_array_header(self, n):
if n >= 2**32: if n >= 2**32:
raise PackValueError raise ValueError
self._pack_array_header(n) self._pack_array_header(n)
ret = self._buffer.getvalue()
if self._autoreset: if self._autoreset:
ret = self._buffer.getvalue()
self._buffer = StringIO() self._buffer = StringIO()
elif USING_STRINGBUILDER: return ret
self._buffer = StringIO(ret)
return ret
def pack_map_header(self, n): def pack_map_header(self, n):
if n >= 2**32: if n >= 2**32:
raise PackValueError raise ValueError
self._pack_map_header(n) self._pack_map_header(n)
ret = self._buffer.getvalue()
if self._autoreset: if self._autoreset:
ret = self._buffer.getvalue()
self._buffer = StringIO() self._buffer = StringIO()
elif USING_STRINGBUILDER: return ret
self._buffer = StringIO(ret)
return ret
def pack_ext_type(self, typecode, data): def pack_ext_type(self, typecode, data):
if not isinstance(typecode, int): if not isinstance(typecode, int):
@ -896,7 +925,7 @@ class Packer(object):
raise TypeError("data must have bytes type") raise TypeError("data must have bytes type")
L = len(data) L = len(data)
if L > 0xffffffff: if L > 0xffffffff:
raise PackValueError("Too large data") raise ValueError("Too large data")
if L == 1: if L == 1:
self._buffer.write(b'\xd4') self._buffer.write(b'\xd4')
elif L == 2: elif L == 2:
@ -923,7 +952,7 @@ class Packer(object):
return self._buffer.write(struct.pack(">BH", 0xdc, n)) return self._buffer.write(struct.pack(">BH", 0xdc, n))
if n <= 0xffffffff: if n <= 0xffffffff:
return self._buffer.write(struct.pack(">BI", 0xdd, n)) return self._buffer.write(struct.pack(">BI", 0xdd, n))
raise PackValueError("Array is too large") raise ValueError("Array is too large")
def _pack_map_header(self, n): def _pack_map_header(self, n):
if n <= 0x0f: if n <= 0x0f:
@ -932,7 +961,7 @@ class Packer(object):
return self._buffer.write(struct.pack(">BH", 0xde, n)) return self._buffer.write(struct.pack(">BH", 0xde, n))
if n <= 0xffffffff: if n <= 0xffffffff:
return self._buffer.write(struct.pack(">BI", 0xdf, n)) return self._buffer.write(struct.pack(">BI", 0xdf, n))
raise PackValueError("Dict is too large") raise ValueError("Dict is too large")
def _pack_map_pairs(self, n, pairs, nest_limit=DEFAULT_RECURSE_LIMIT): def _pack_map_pairs(self, n, pairs, nest_limit=DEFAULT_RECURSE_LIMIT):
self._pack_map_header(n) self._pack_map_header(n)
@ -950,7 +979,7 @@ class Packer(object):
elif n <= 0xffffffff: elif n <= 0xffffffff:
self._buffer.write(struct.pack(">BI", 0xdb, n)) self._buffer.write(struct.pack(">BI", 0xdb, n))
else: else:
raise PackValueError('Raw is too large') raise ValueError('Raw is too large')
def _pack_bin_header(self, n): def _pack_bin_header(self, n):
if not self._use_bin_type: if not self._use_bin_type:
@ -962,10 +991,22 @@ class Packer(object):
elif n <= 0xffffffff: elif n <= 0xffffffff:
return self._buffer.write(struct.pack(">BI", 0xc6, n)) return self._buffer.write(struct.pack(">BI", 0xc6, n))
else: else:
raise PackValueError('Bin is too large') raise ValueError('Bin is too large')
def bytes(self): def bytes(self):
"""Return internal buffer contents as bytes object"""
return self._buffer.getvalue() return self._buffer.getvalue()
def reset(self): def reset(self):
"""Reset internal buffer.
This method is usaful only when autoreset=False.
"""
self._buffer = StringIO() self._buffer = StringIO()
def getbuffer(self):
"""Return view of internal buffer."""
if USING_STRINGBUILDER or PY2:
return memoryview(self.bytes())
else:
return self._buffer.getbuffer()

Loading…
Cancel
Save