fallback.py 37 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027
  1. """Fallback pure Python implementation of msgpack"""
  2. import sys
  3. import struct
  4. import warnings
  5. if sys.version_info[0] == 2:
  6. PY2 = True
  7. int_types = (int, long)
  8. def dict_iteritems(d):
  9. return d.iteritems()
  10. else:
  11. PY2 = False
  12. int_types = int
  13. unicode = str
  14. xrange = range
  15. def dict_iteritems(d):
  16. return d.items()
  17. if sys.version_info < (3, 5):
  18. # Ugly hack...
  19. RecursionError = RuntimeError
  20. def _is_recursionerror(e):
  21. return len(e.args) == 1 and isinstance(e.args[0], str) and \
  22. e.args[0].startswith('maximum recursion depth exceeded')
  23. else:
  24. def _is_recursionerror(e):
  25. return True
  26. if hasattr(sys, 'pypy_version_info'):
  27. # cStringIO is slow on PyPy, StringIO is faster. However: PyPy's own
  28. # StringBuilder is fastest.
  29. from __pypy__ import newlist_hint
  30. try:
  31. from __pypy__.builders import BytesBuilder as StringBuilder
  32. except ImportError:
  33. from __pypy__.builders import StringBuilder
  34. USING_STRINGBUILDER = True
  35. class StringIO(object):
  36. def __init__(self, s=b''):
  37. if s:
  38. self.builder = StringBuilder(len(s))
  39. self.builder.append(s)
  40. else:
  41. self.builder = StringBuilder()
  42. def write(self, s):
  43. if isinstance(s, memoryview):
  44. s = s.tobytes()
  45. elif isinstance(s, bytearray):
  46. s = bytes(s)
  47. self.builder.append(s)
  48. def getvalue(self):
  49. return self.builder.build()
  50. else:
  51. USING_STRINGBUILDER = False
  52. from io import BytesIO as StringIO
  53. newlist_hint = lambda size: []
  54. from msgpack.exceptions import (
  55. BufferFull,
  56. OutOfData,
  57. ExtraData,
  58. FormatError,
  59. StackError,
  60. )
  61. from msgpack import ExtType
  62. EX_SKIP = 0
  63. EX_CONSTRUCT = 1
  64. EX_READ_ARRAY_HEADER = 2
  65. EX_READ_MAP_HEADER = 3
  66. TYPE_IMMEDIATE = 0
  67. TYPE_ARRAY = 1
  68. TYPE_MAP = 2
  69. TYPE_RAW = 3
  70. TYPE_BIN = 4
  71. TYPE_EXT = 5
  72. DEFAULT_RECURSE_LIMIT = 511
  73. def _check_type_strict(obj, t, type=type, tuple=tuple):
  74. if type(t) is tuple:
  75. return type(obj) in t
  76. else:
  77. return type(obj) is t
  78. def _get_data_from_buffer(obj):
  79. try:
  80. view = memoryview(obj)
  81. except TypeError:
  82. # try to use legacy buffer protocol if 2.7, otherwise re-raise
  83. if PY2:
  84. view = memoryview(buffer(obj))
  85. warnings.warn("using old buffer interface to unpack %s; "
  86. "this leads to unpacking errors if slicing is used and "
  87. "will be removed in a future version" % type(obj),
  88. RuntimeWarning, stacklevel=3)
  89. else:
  90. raise
  91. if view.itemsize != 1:
  92. raise ValueError("cannot unpack from multi-byte object")
  93. return view
  94. def unpack(stream, **kwargs):
  95. warnings.warn(
  96. "Direct calling implementation's unpack() is deprecated, Use msgpack.unpack() or unpackb() instead.",
  97. DeprecationWarning, stacklevel=2)
  98. data = stream.read()
  99. return unpackb(data, **kwargs)
  100. def unpackb(packed, **kwargs):
  101. """
  102. Unpack an object from `packed`.
  103. Raises ``ExtraData`` when *packed* contains extra bytes.
  104. Raises ``ValueError`` when *packed* is incomplete.
  105. Raises ``FormatError`` when *packed* is not valid msgpack.
  106. Raises ``StackError`` when *packed* contains too nested.
  107. Other exceptions can be raised during unpacking.
  108. See :class:`Unpacker` for options.
  109. """
  110. unpacker = Unpacker(None, max_buffer_size=len(packed), **kwargs)
  111. unpacker.feed(packed)
  112. try:
  113. ret = unpacker._unpack()
  114. except OutOfData:
  115. raise ValueError("Unpack failed: incomplete input")
  116. except RecursionError as e:
  117. if _is_recursionerror(e):
  118. raise StackError
  119. raise
  120. if unpacker._got_extradata():
  121. raise ExtraData(ret, unpacker._get_extradata())
  122. return ret
  123. if sys.version_info < (2, 7, 6):
  124. def _unpack_from(f, b, o=0):
  125. """Explicit typcast for legacy struct.unpack_from"""
  126. return struct.unpack_from(f, bytes(b), o)
  127. else:
  128. _unpack_from = struct.unpack_from
  129. class Unpacker(object):
  130. """Streaming unpacker.
  131. arguments:
  132. :param file_like:
  133. File-like object having `.read(n)` method.
  134. If specified, unpacker reads serialized data from it and :meth:`feed()` is not usable.
  135. :param int read_size:
  136. Used as `file_like.read(read_size)`. (default: `min(16*1024, max_buffer_size)`)
  137. :param bool use_list:
  138. If true, unpack msgpack array to Python list.
  139. Otherwise, unpack to Python tuple. (default: True)
  140. :param bool raw:
  141. If true, unpack msgpack raw to Python bytes (default).
  142. Otherwise, unpack to Python str (or unicode on Python 2) by decoding
  143. with UTF-8 encoding (recommended).
  144. Currently, the default is true, but it will be changed to false in
  145. near future. So you must specify it explicitly for keeping backward
  146. compatibility.
  147. *encoding* option which is deprecated overrides this option.
  148. :param bool strict_map_key:
  149. If true, only str or bytes are accepted for map (dict) keys.
  150. It's False by default for backward-compatibility.
  151. But it will be True from msgpack 1.0.
  152. :param callable object_hook:
  153. When specified, it should be callable.
  154. Unpacker calls it with a dict argument after unpacking msgpack map.
  155. (See also simplejson)
  156. :param callable object_pairs_hook:
  157. When specified, it should be callable.
  158. Unpacker calls it with a list of key-value pairs after unpacking msgpack map.
  159. (See also simplejson)
  160. :param str encoding:
  161. Encoding used for decoding msgpack raw.
  162. If it is None (default), msgpack raw is deserialized to Python bytes.
  163. :param str unicode_errors:
  164. (deprecated) Used for decoding msgpack raw with *encoding*.
  165. (default: `'strict'`)
  166. :param int max_buffer_size:
  167. Limits size of data waiting unpacked. 0 means system's INT_MAX (default).
  168. Raises `BufferFull` exception when it is insufficient.
  169. You should set this parameter when unpacking data from untrusted source.
  170. :param int max_str_len:
  171. Deprecated, use *max_buffer_size* instead.
  172. Limits max length of str. (default: max_buffer_size or 1024*1024)
  173. :param int max_bin_len:
  174. Deprecated, use *max_buffer_size* instead.
  175. Limits max length of bin. (default: max_buffer_size or 1024*1024)
  176. :param int max_array_len:
  177. Limits max length of array.
  178. (default: max_buffer_size or 128*1024)
  179. :param int max_map_len:
  180. Limits max length of map.
  181. (default: max_buffer_size//2 or 32*1024)
  182. :param int max_ext_len:
  183. Deprecated, use *max_buffer_size* instead.
  184. Limits max size of ext type. (default: max_buffer_size or 1024*1024)
  185. Example of streaming deserialize from file-like object::
  186. unpacker = Unpacker(file_like, raw=False, max_buffer_size=10*1024*1024)
  187. for o in unpacker:
  188. process(o)
  189. Example of streaming deserialize from socket::
  190. unpacker = Unpacker(raw=False, max_buffer_size=10*1024*1024)
  191. while True:
  192. buf = sock.recv(1024**2)
  193. if not buf:
  194. break
  195. unpacker.feed(buf)
  196. for o in unpacker:
  197. process(o)
  198. Raises ``ExtraData`` when *packed* contains extra bytes.
  199. Raises ``OutOfData`` when *packed* is incomplete.
  200. Raises ``FormatError`` when *packed* is not valid msgpack.
  201. Raises ``StackError`` when *packed* contains too nested.
  202. Other exceptions can be raised during unpacking.
  203. """
  204. def __init__(self, file_like=None, read_size=0, use_list=True, raw=True, strict_map_key=False,
  205. object_hook=None, object_pairs_hook=None, list_hook=None,
  206. encoding=None, unicode_errors=None, max_buffer_size=0,
  207. ext_hook=ExtType,
  208. max_str_len=-1,
  209. max_bin_len=-1,
  210. max_array_len=-1,
  211. max_map_len=-1,
  212. max_ext_len=-1):
  213. if encoding is not None:
  214. warnings.warn(
  215. "encoding is deprecated, Use raw=False instead.",
  216. DeprecationWarning, stacklevel=2)
  217. if unicode_errors is None:
  218. unicode_errors = 'strict'
  219. if file_like is None:
  220. self._feeding = True
  221. else:
  222. if not callable(file_like.read):
  223. raise TypeError("`file_like.read` must be callable")
  224. self.file_like = file_like
  225. self._feeding = False
  226. #: array of bytes fed.
  227. self._buffer = bytearray()
  228. #: Which position we currently reads
  229. self._buff_i = 0
  230. # When Unpacker is used as an iterable, between the calls to next(),
  231. # the buffer is not "consumed" completely, for efficiency sake.
  232. # Instead, it is done sloppily. To make sure we raise BufferFull at
  233. # the correct moments, we have to keep track of how sloppy we were.
  234. # Furthermore, when the buffer is incomplete (that is: in the case
  235. # we raise an OutOfData) we need to rollback the buffer to the correct
  236. # state, which _buf_checkpoint records.
  237. self._buf_checkpoint = 0
  238. if max_str_len == -1:
  239. max_str_len = max_buffer_size or 1024*1024
  240. if max_bin_len == -1:
  241. max_bin_len = max_buffer_size or 1024*1024
  242. if max_array_len == -1:
  243. max_array_len = max_buffer_size or 128*1024
  244. if max_map_len == -1:
  245. max_map_len = max_buffer_size//2 or 32*1024
  246. if max_ext_len == -1:
  247. max_ext_len = max_buffer_size or 1024*1024
  248. self._max_buffer_size = max_buffer_size or 2**31-1
  249. if read_size > self._max_buffer_size:
  250. raise ValueError("read_size must be smaller than max_buffer_size")
  251. self._read_size = read_size or min(self._max_buffer_size, 16*1024)
  252. self._raw = bool(raw)
  253. self._strict_map_key = bool(strict_map_key)
  254. self._encoding = encoding
  255. self._unicode_errors = unicode_errors
  256. self._use_list = use_list
  257. self._list_hook = list_hook
  258. self._object_hook = object_hook
  259. self._object_pairs_hook = object_pairs_hook
  260. self._ext_hook = ext_hook
  261. self._max_str_len = max_str_len
  262. self._max_bin_len = max_bin_len
  263. self._max_array_len = max_array_len
  264. self._max_map_len = max_map_len
  265. self._max_ext_len = max_ext_len
  266. self._stream_offset = 0
  267. if list_hook is not None and not callable(list_hook):
  268. raise TypeError('`list_hook` is not callable')
  269. if object_hook is not None and not callable(object_hook):
  270. raise TypeError('`object_hook` is not callable')
  271. if object_pairs_hook is not None and not callable(object_pairs_hook):
  272. raise TypeError('`object_pairs_hook` is not callable')
  273. if object_hook is not None and object_pairs_hook is not None:
  274. raise TypeError("object_pairs_hook and object_hook are mutually "
  275. "exclusive")
  276. if not callable(ext_hook):
  277. raise TypeError("`ext_hook` is not callable")
  278. def feed(self, next_bytes):
  279. assert self._feeding
  280. view = _get_data_from_buffer(next_bytes)
  281. if (len(self._buffer) - self._buff_i + len(view) > self._max_buffer_size):
  282. raise BufferFull
  283. # Strip buffer before checkpoint before reading file.
  284. if self._buf_checkpoint > 0:
  285. del self._buffer[:self._buf_checkpoint]
  286. self._buff_i -= self._buf_checkpoint
  287. self._buf_checkpoint = 0
  288. # Use extend here: INPLACE_ADD += doesn't reliably typecast memoryview in jython
  289. self._buffer.extend(view)
  290. def _consume(self):
  291. """ Gets rid of the used parts of the buffer. """
  292. self._stream_offset += self._buff_i - self._buf_checkpoint
  293. self._buf_checkpoint = self._buff_i
  294. def _got_extradata(self):
  295. return self._buff_i < len(self._buffer)
  296. def _get_extradata(self):
  297. return self._buffer[self._buff_i:]
  298. def read_bytes(self, n):
  299. return self._read(n)
  300. def _read(self, n):
  301. # (int) -> bytearray
  302. self._reserve(n)
  303. i = self._buff_i
  304. self._buff_i = i+n
  305. return self._buffer[i:i+n]
  306. def _reserve(self, n):
  307. remain_bytes = len(self._buffer) - self._buff_i - n
  308. # Fast path: buffer has n bytes already
  309. if remain_bytes >= 0:
  310. return
  311. if self._feeding:
  312. self._buff_i = self._buf_checkpoint
  313. raise OutOfData
  314. # Strip buffer before checkpoint before reading file.
  315. if self._buf_checkpoint > 0:
  316. del self._buffer[:self._buf_checkpoint]
  317. self._buff_i -= self._buf_checkpoint
  318. self._buf_checkpoint = 0
  319. # Read from file
  320. remain_bytes = -remain_bytes
  321. while remain_bytes > 0:
  322. to_read_bytes = max(self._read_size, remain_bytes)
  323. read_data = self.file_like.read(to_read_bytes)
  324. if not read_data:
  325. break
  326. assert isinstance(read_data, bytes)
  327. self._buffer += read_data
  328. remain_bytes -= len(read_data)
  329. if len(self._buffer) < n + self._buff_i:
  330. self._buff_i = 0 # rollback
  331. raise OutOfData
  332. def _read_header(self, execute=EX_CONSTRUCT):
  333. typ = TYPE_IMMEDIATE
  334. n = 0
  335. obj = None
  336. self._reserve(1)
  337. b = self._buffer[self._buff_i]
  338. self._buff_i += 1
  339. if b & 0b10000000 == 0:
  340. obj = b
  341. elif b & 0b11100000 == 0b11100000:
  342. obj = -1 - (b ^ 0xff)
  343. elif b & 0b11100000 == 0b10100000:
  344. n = b & 0b00011111
  345. typ = TYPE_RAW
  346. if n > self._max_str_len:
  347. raise ValueError("%s exceeds max_str_len(%s)", n, self._max_str_len)
  348. obj = self._read(n)
  349. elif b & 0b11110000 == 0b10010000:
  350. n = b & 0b00001111
  351. typ = TYPE_ARRAY
  352. if n > self._max_array_len:
  353. raise ValueError("%s exceeds max_array_len(%s)", n, self._max_array_len)
  354. elif b & 0b11110000 == 0b10000000:
  355. n = b & 0b00001111
  356. typ = TYPE_MAP
  357. if n > self._max_map_len:
  358. raise ValueError("%s exceeds max_map_len(%s)", n, self._max_map_len)
  359. elif b == 0xc0:
  360. obj = None
  361. elif b == 0xc2:
  362. obj = False
  363. elif b == 0xc3:
  364. obj = True
  365. elif b == 0xc4:
  366. typ = TYPE_BIN
  367. self._reserve(1)
  368. n = self._buffer[self._buff_i]
  369. self._buff_i += 1
  370. if n > self._max_bin_len:
  371. raise ValueError("%s exceeds max_bin_len(%s)" % (n, self._max_bin_len))
  372. obj = self._read(n)
  373. elif b == 0xc5:
  374. typ = TYPE_BIN
  375. self._reserve(2)
  376. n = _unpack_from(">H", self._buffer, self._buff_i)[0]
  377. self._buff_i += 2
  378. if n > self._max_bin_len:
  379. raise ValueError("%s exceeds max_bin_len(%s)" % (n, self._max_bin_len))
  380. obj = self._read(n)
  381. elif b == 0xc6:
  382. typ = TYPE_BIN
  383. self._reserve(4)
  384. n = _unpack_from(">I", self._buffer, self._buff_i)[0]
  385. self._buff_i += 4
  386. if n > self._max_bin_len:
  387. raise ValueError("%s exceeds max_bin_len(%s)" % (n, self._max_bin_len))
  388. obj = self._read(n)
  389. elif b == 0xc7: # ext 8
  390. typ = TYPE_EXT
  391. self._reserve(2)
  392. L, n = _unpack_from('Bb', self._buffer, self._buff_i)
  393. self._buff_i += 2
  394. if L > self._max_ext_len:
  395. raise ValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len))
  396. obj = self._read(L)
  397. elif b == 0xc8: # ext 16
  398. typ = TYPE_EXT
  399. self._reserve(3)
  400. L, n = _unpack_from('>Hb', self._buffer, self._buff_i)
  401. self._buff_i += 3
  402. if L > self._max_ext_len:
  403. raise ValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len))
  404. obj = self._read(L)
  405. elif b == 0xc9: # ext 32
  406. typ = TYPE_EXT
  407. self._reserve(5)
  408. L, n = _unpack_from('>Ib', self._buffer, self._buff_i)
  409. self._buff_i += 5
  410. if L > self._max_ext_len:
  411. raise ValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len))
  412. obj = self._read(L)
  413. elif b == 0xca:
  414. self._reserve(4)
  415. obj = _unpack_from(">f", self._buffer, self._buff_i)[0]
  416. self._buff_i += 4
  417. elif b == 0xcb:
  418. self._reserve(8)
  419. obj = _unpack_from(">d", self._buffer, self._buff_i)[0]
  420. self._buff_i += 8
  421. elif b == 0xcc:
  422. self._reserve(1)
  423. obj = self._buffer[self._buff_i]
  424. self._buff_i += 1
  425. elif b == 0xcd:
  426. self._reserve(2)
  427. obj = _unpack_from(">H", self._buffer, self._buff_i)[0]
  428. self._buff_i += 2
  429. elif b == 0xce:
  430. self._reserve(4)
  431. obj = _unpack_from(">I", self._buffer, self._buff_i)[0]
  432. self._buff_i += 4
  433. elif b == 0xcf:
  434. self._reserve(8)
  435. obj = _unpack_from(">Q", self._buffer, self._buff_i)[0]
  436. self._buff_i += 8
  437. elif b == 0xd0:
  438. self._reserve(1)
  439. obj = _unpack_from("b", self._buffer, self._buff_i)[0]
  440. self._buff_i += 1
  441. elif b == 0xd1:
  442. self._reserve(2)
  443. obj = _unpack_from(">h", self._buffer, self._buff_i)[0]
  444. self._buff_i += 2
  445. elif b == 0xd2:
  446. self._reserve(4)
  447. obj = _unpack_from(">i", self._buffer, self._buff_i)[0]
  448. self._buff_i += 4
  449. elif b == 0xd3:
  450. self._reserve(8)
  451. obj = _unpack_from(">q", self._buffer, self._buff_i)[0]
  452. self._buff_i += 8
  453. elif b == 0xd4: # fixext 1
  454. typ = TYPE_EXT
  455. if self._max_ext_len < 1:
  456. raise ValueError("%s exceeds max_ext_len(%s)" % (1, self._max_ext_len))
  457. self._reserve(2)
  458. n, obj = _unpack_from("b1s", self._buffer, self._buff_i)
  459. self._buff_i += 2
  460. elif b == 0xd5: # fixext 2
  461. typ = TYPE_EXT
  462. if self._max_ext_len < 2:
  463. raise ValueError("%s exceeds max_ext_len(%s)" % (2, self._max_ext_len))
  464. self._reserve(3)
  465. n, obj = _unpack_from("b2s", self._buffer, self._buff_i)
  466. self._buff_i += 3
  467. elif b == 0xd6: # fixext 4
  468. typ = TYPE_EXT
  469. if self._max_ext_len < 4:
  470. raise ValueError("%s exceeds max_ext_len(%s)" % (4, self._max_ext_len))
  471. self._reserve(5)
  472. n, obj = _unpack_from("b4s", self._buffer, self._buff_i)
  473. self._buff_i += 5
  474. elif b == 0xd7: # fixext 8
  475. typ = TYPE_EXT
  476. if self._max_ext_len < 8:
  477. raise ValueError("%s exceeds max_ext_len(%s)" % (8, self._max_ext_len))
  478. self._reserve(9)
  479. n, obj = _unpack_from("b8s", self._buffer, self._buff_i)
  480. self._buff_i += 9
  481. elif b == 0xd8: # fixext 16
  482. typ = TYPE_EXT
  483. if self._max_ext_len < 16:
  484. raise ValueError("%s exceeds max_ext_len(%s)" % (16, self._max_ext_len))
  485. self._reserve(17)
  486. n, obj = _unpack_from("b16s", self._buffer, self._buff_i)
  487. self._buff_i += 17
  488. elif b == 0xd9:
  489. typ = TYPE_RAW
  490. self._reserve(1)
  491. n = self._buffer[self._buff_i]
  492. self._buff_i += 1
  493. if n > self._max_str_len:
  494. raise ValueError("%s exceeds max_str_len(%s)", n, self._max_str_len)
  495. obj = self._read(n)
  496. elif b == 0xda:
  497. typ = TYPE_RAW
  498. self._reserve(2)
  499. n, = _unpack_from(">H", self._buffer, self._buff_i)
  500. self._buff_i += 2
  501. if n > self._max_str_len:
  502. raise ValueError("%s exceeds max_str_len(%s)", n, self._max_str_len)
  503. obj = self._read(n)
  504. elif b == 0xdb:
  505. typ = TYPE_RAW
  506. self._reserve(4)
  507. n, = _unpack_from(">I", self._buffer, self._buff_i)
  508. self._buff_i += 4
  509. if n > self._max_str_len:
  510. raise ValueError("%s exceeds max_str_len(%s)", n, self._max_str_len)
  511. obj = self._read(n)
  512. elif b == 0xdc:
  513. typ = TYPE_ARRAY
  514. self._reserve(2)
  515. n, = _unpack_from(">H", self._buffer, self._buff_i)
  516. self._buff_i += 2
  517. if n > self._max_array_len:
  518. raise ValueError("%s exceeds max_array_len(%s)", n, self._max_array_len)
  519. elif b == 0xdd:
  520. typ = TYPE_ARRAY
  521. self._reserve(4)
  522. n, = _unpack_from(">I", self._buffer, self._buff_i)
  523. self._buff_i += 4
  524. if n > self._max_array_len:
  525. raise ValueError("%s exceeds max_array_len(%s)", n, self._max_array_len)
  526. elif b == 0xde:
  527. self._reserve(2)
  528. n, = _unpack_from(">H", self._buffer, self._buff_i)
  529. self._buff_i += 2
  530. if n > self._max_map_len:
  531. raise ValueError("%s exceeds max_map_len(%s)", n, self._max_map_len)
  532. typ = TYPE_MAP
  533. elif b == 0xdf:
  534. self._reserve(4)
  535. n, = _unpack_from(">I", self._buffer, self._buff_i)
  536. self._buff_i += 4
  537. if n > self._max_map_len:
  538. raise ValueError("%s exceeds max_map_len(%s)", n, self._max_map_len)
  539. typ = TYPE_MAP
  540. else:
  541. raise FormatError("Unknown header: 0x%x" % b)
  542. return typ, n, obj
  543. def _unpack(self, execute=EX_CONSTRUCT):
  544. typ, n, obj = self._read_header(execute)
  545. if execute == EX_READ_ARRAY_HEADER:
  546. if typ != TYPE_ARRAY:
  547. raise ValueError("Expected array")
  548. return n
  549. if execute == EX_READ_MAP_HEADER:
  550. if typ != TYPE_MAP:
  551. raise ValueError("Expected map")
  552. return n
  553. # TODO should we eliminate the recursion?
  554. if typ == TYPE_ARRAY:
  555. if execute == EX_SKIP:
  556. for i in xrange(n):
  557. # TODO check whether we need to call `list_hook`
  558. self._unpack(EX_SKIP)
  559. return
  560. ret = newlist_hint(n)
  561. for i in xrange(n):
  562. ret.append(self._unpack(EX_CONSTRUCT))
  563. if self._list_hook is not None:
  564. ret = self._list_hook(ret)
  565. # TODO is the interaction between `list_hook` and `use_list` ok?
  566. return ret if self._use_list else tuple(ret)
  567. if typ == TYPE_MAP:
  568. if execute == EX_SKIP:
  569. for i in xrange(n):
  570. # TODO check whether we need to call hooks
  571. self._unpack(EX_SKIP)
  572. self._unpack(EX_SKIP)
  573. return
  574. if self._object_pairs_hook is not None:
  575. ret = self._object_pairs_hook(
  576. (self._unpack(EX_CONSTRUCT),
  577. self._unpack(EX_CONSTRUCT))
  578. for _ in xrange(n))
  579. else:
  580. ret = {}
  581. for _ in xrange(n):
  582. key = self._unpack(EX_CONSTRUCT)
  583. if self._strict_map_key and type(key) not in (unicode, bytes):
  584. raise ValueError("%s is not allowed for map key" % str(type(key)))
  585. ret[key] = self._unpack(EX_CONSTRUCT)
  586. if self._object_hook is not None:
  587. ret = self._object_hook(ret)
  588. return ret
  589. if execute == EX_SKIP:
  590. return
  591. if typ == TYPE_RAW:
  592. if self._encoding is not None:
  593. obj = obj.decode(self._encoding, self._unicode_errors)
  594. elif self._raw:
  595. obj = bytes(obj)
  596. else:
  597. obj = obj.decode('utf_8')
  598. return obj
  599. if typ == TYPE_EXT:
  600. return self._ext_hook(n, bytes(obj))
  601. if typ == TYPE_BIN:
  602. return bytes(obj)
  603. assert typ == TYPE_IMMEDIATE
  604. return obj
  605. def __iter__(self):
  606. return self
  607. def __next__(self):
  608. try:
  609. ret = self._unpack(EX_CONSTRUCT)
  610. self._consume()
  611. return ret
  612. except OutOfData:
  613. self._consume()
  614. raise StopIteration
  615. except RecursionError:
  616. raise StackError
  617. next = __next__
  618. def skip(self):
  619. self._unpack(EX_SKIP)
  620. self._consume()
  621. def unpack(self):
  622. try:
  623. ret = self._unpack(EX_CONSTRUCT)
  624. except RecursionError:
  625. raise StackError
  626. self._consume()
  627. return ret
  628. def read_array_header(self):
  629. ret = self._unpack(EX_READ_ARRAY_HEADER)
  630. self._consume()
  631. return ret
  632. def read_map_header(self):
  633. ret = self._unpack(EX_READ_MAP_HEADER)
  634. self._consume()
  635. return ret
  636. def tell(self):
  637. return self._stream_offset
  638. class Packer(object):
  639. """
  640. MessagePack Packer
  641. usage:
  642. packer = Packer()
  643. astream.write(packer.pack(a))
  644. astream.write(packer.pack(b))
  645. Packer's constructor has some keyword arguments:
  646. :param callable default:
  647. Convert user type to builtin type that Packer supports.
  648. See also simplejson's document.
  649. :param bool use_single_float:
  650. Use single precision float type for float. (default: False)
  651. :param bool autoreset:
  652. Reset buffer after each pack and return its content as `bytes`. (default: True).
  653. If set this to false, use `bytes()` to get content and `.reset()` to clear buffer.
  654. :param bool use_bin_type:
  655. Use bin type introduced in msgpack spec 2.0 for bytes.
  656. It also enables str8 type for unicode.
  657. :param bool strict_types:
  658. If set to true, types will be checked to be exact. Derived classes
  659. from serializeable types will not be serialized and will be
  660. treated as unsupported type and forwarded to default.
  661. Additionally tuples will not be serialized as lists.
  662. This is useful when trying to implement accurate serialization
  663. for python types.
  664. :param str encoding:
  665. (deprecated) Convert unicode to bytes with this encoding. (default: 'utf-8')
  666. :param str unicode_errors:
  667. Error handler for encoding unicode. (default: 'strict')
  668. """
  669. def __init__(self, default=None, encoding=None, unicode_errors=None,
  670. use_single_float=False, autoreset=True, use_bin_type=False,
  671. strict_types=False):
  672. if encoding is None:
  673. encoding = 'utf_8'
  674. else:
  675. warnings.warn(
  676. "encoding is deprecated, Use raw=False instead.",
  677. DeprecationWarning, stacklevel=2)
  678. if unicode_errors is None:
  679. unicode_errors = 'strict'
  680. self._strict_types = strict_types
  681. self._use_float = use_single_float
  682. self._autoreset = autoreset
  683. self._use_bin_type = use_bin_type
  684. self._encoding = encoding
  685. self._unicode_errors = unicode_errors
  686. self._buffer = StringIO()
  687. if default is not None:
  688. if not callable(default):
  689. raise TypeError("default must be callable")
  690. self._default = default
  691. def _pack(self, obj, nest_limit=DEFAULT_RECURSE_LIMIT,
  692. check=isinstance, check_type_strict=_check_type_strict):
  693. default_used = False
  694. if self._strict_types:
  695. check = check_type_strict
  696. list_types = list
  697. else:
  698. list_types = (list, tuple)
  699. while True:
  700. if nest_limit < 0:
  701. raise ValueError("recursion limit exceeded")
  702. if obj is None:
  703. return self._buffer.write(b"\xc0")
  704. if check(obj, bool):
  705. if obj:
  706. return self._buffer.write(b"\xc3")
  707. return self._buffer.write(b"\xc2")
  708. if check(obj, int_types):
  709. if 0 <= obj < 0x80:
  710. return self._buffer.write(struct.pack("B", obj))
  711. if -0x20 <= obj < 0:
  712. return self._buffer.write(struct.pack("b", obj))
  713. if 0x80 <= obj <= 0xff:
  714. return self._buffer.write(struct.pack("BB", 0xcc, obj))
  715. if -0x80 <= obj < 0:
  716. return self._buffer.write(struct.pack(">Bb", 0xd0, obj))
  717. if 0xff < obj <= 0xffff:
  718. return self._buffer.write(struct.pack(">BH", 0xcd, obj))
  719. if -0x8000 <= obj < -0x80:
  720. return self._buffer.write(struct.pack(">Bh", 0xd1, obj))
  721. if 0xffff < obj <= 0xffffffff:
  722. return self._buffer.write(struct.pack(">BI", 0xce, obj))
  723. if -0x80000000 <= obj < -0x8000:
  724. return self._buffer.write(struct.pack(">Bi", 0xd2, obj))
  725. if 0xffffffff < obj <= 0xffffffffffffffff:
  726. return self._buffer.write(struct.pack(">BQ", 0xcf, obj))
  727. if -0x8000000000000000 <= obj < -0x80000000:
  728. return self._buffer.write(struct.pack(">Bq", 0xd3, obj))
  729. if not default_used and self._default is not None:
  730. obj = self._default(obj)
  731. default_used = True
  732. continue
  733. raise OverflowError("Integer value out of range")
  734. if check(obj, (bytes, bytearray)):
  735. n = len(obj)
  736. if n >= 2**32:
  737. raise ValueError("%s is too large" % type(obj).__name__)
  738. self._pack_bin_header(n)
  739. return self._buffer.write(obj)
  740. if check(obj, unicode):
  741. if self._encoding is None:
  742. raise TypeError(
  743. "Can't encode unicode string: "
  744. "no encoding is specified")
  745. obj = obj.encode(self._encoding, self._unicode_errors)
  746. n = len(obj)
  747. if n >= 2**32:
  748. raise ValueError("String is too large")
  749. self._pack_raw_header(n)
  750. return self._buffer.write(obj)
  751. if check(obj, memoryview):
  752. n = len(obj) * obj.itemsize
  753. if n >= 2**32:
  754. raise ValueError("Memoryview is too large")
  755. self._pack_bin_header(n)
  756. return self._buffer.write(obj)
  757. if check(obj, float):
  758. if self._use_float:
  759. return self._buffer.write(struct.pack(">Bf", 0xca, obj))
  760. return self._buffer.write(struct.pack(">Bd", 0xcb, obj))
  761. if check(obj, ExtType):
  762. code = obj.code
  763. data = obj.data
  764. assert isinstance(code, int)
  765. assert isinstance(data, bytes)
  766. L = len(data)
  767. if L == 1:
  768. self._buffer.write(b'\xd4')
  769. elif L == 2:
  770. self._buffer.write(b'\xd5')
  771. elif L == 4:
  772. self._buffer.write(b'\xd6')
  773. elif L == 8:
  774. self._buffer.write(b'\xd7')
  775. elif L == 16:
  776. self._buffer.write(b'\xd8')
  777. elif L <= 0xff:
  778. self._buffer.write(struct.pack(">BB", 0xc7, L))
  779. elif L <= 0xffff:
  780. self._buffer.write(struct.pack(">BH", 0xc8, L))
  781. else:
  782. self._buffer.write(struct.pack(">BI", 0xc9, L))
  783. self._buffer.write(struct.pack("b", code))
  784. self._buffer.write(data)
  785. return
  786. if check(obj, list_types):
  787. n = len(obj)
  788. self._pack_array_header(n)
  789. for i in xrange(n):
  790. self._pack(obj[i], nest_limit - 1)
  791. return
  792. if check(obj, dict):
  793. return self._pack_map_pairs(len(obj), dict_iteritems(obj),
  794. nest_limit - 1)
  795. if not default_used and self._default is not None:
  796. obj = self._default(obj)
  797. default_used = 1
  798. continue
  799. raise TypeError("Cannot serialize %r" % (obj, ))
  800. def pack(self, obj):
  801. try:
  802. self._pack(obj)
  803. except:
  804. self._buffer = StringIO() # force reset
  805. raise
  806. if self._autoreset:
  807. ret = self._buffer.getvalue()
  808. self._buffer = StringIO()
  809. return ret
  810. def pack_map_pairs(self, pairs):
  811. self._pack_map_pairs(len(pairs), pairs)
  812. if self._autoreset:
  813. ret = self._buffer.getvalue()
  814. self._buffer = StringIO()
  815. return ret
  816. def pack_array_header(self, n):
  817. if n >= 2**32:
  818. raise ValueError
  819. self._pack_array_header(n)
  820. if self._autoreset:
  821. ret = self._buffer.getvalue()
  822. self._buffer = StringIO()
  823. return ret
  824. def pack_map_header(self, n):
  825. if n >= 2**32:
  826. raise ValueError
  827. self._pack_map_header(n)
  828. if self._autoreset:
  829. ret = self._buffer.getvalue()
  830. self._buffer = StringIO()
  831. return ret
  832. def pack_ext_type(self, typecode, data):
  833. if not isinstance(typecode, int):
  834. raise TypeError("typecode must have int type.")
  835. if not 0 <= typecode <= 127:
  836. raise ValueError("typecode should be 0-127")
  837. if not isinstance(data, bytes):
  838. raise TypeError("data must have bytes type")
  839. L = len(data)
  840. if L > 0xffffffff:
  841. raise ValueError("Too large data")
  842. if L == 1:
  843. self._buffer.write(b'\xd4')
  844. elif L == 2:
  845. self._buffer.write(b'\xd5')
  846. elif L == 4:
  847. self._buffer.write(b'\xd6')
  848. elif L == 8:
  849. self._buffer.write(b'\xd7')
  850. elif L == 16:
  851. self._buffer.write(b'\xd8')
  852. elif L <= 0xff:
  853. self._buffer.write(b'\xc7' + struct.pack('B', L))
  854. elif L <= 0xffff:
  855. self._buffer.write(b'\xc8' + struct.pack('>H', L))
  856. else:
  857. self._buffer.write(b'\xc9' + struct.pack('>I', L))
  858. self._buffer.write(struct.pack('B', typecode))
  859. self._buffer.write(data)
  860. def _pack_array_header(self, n):
  861. if n <= 0x0f:
  862. return self._buffer.write(struct.pack('B', 0x90 + n))
  863. if n <= 0xffff:
  864. return self._buffer.write(struct.pack(">BH", 0xdc, n))
  865. if n <= 0xffffffff:
  866. return self._buffer.write(struct.pack(">BI", 0xdd, n))
  867. raise ValueError("Array is too large")
  868. def _pack_map_header(self, n):
  869. if n <= 0x0f:
  870. return self._buffer.write(struct.pack('B', 0x80 + n))
  871. if n <= 0xffff:
  872. return self._buffer.write(struct.pack(">BH", 0xde, n))
  873. if n <= 0xffffffff:
  874. return self._buffer.write(struct.pack(">BI", 0xdf, n))
  875. raise ValueError("Dict is too large")
  876. def _pack_map_pairs(self, n, pairs, nest_limit=DEFAULT_RECURSE_LIMIT):
  877. self._pack_map_header(n)
  878. for (k, v) in pairs:
  879. self._pack(k, nest_limit - 1)
  880. self._pack(v, nest_limit - 1)
  881. def _pack_raw_header(self, n):
  882. if n <= 0x1f:
  883. self._buffer.write(struct.pack('B', 0xa0 + n))
  884. elif self._use_bin_type and n <= 0xff:
  885. self._buffer.write(struct.pack('>BB', 0xd9, n))
  886. elif n <= 0xffff:
  887. self._buffer.write(struct.pack(">BH", 0xda, n))
  888. elif n <= 0xffffffff:
  889. self._buffer.write(struct.pack(">BI", 0xdb, n))
  890. else:
  891. raise ValueError('Raw is too large')
  892. def _pack_bin_header(self, n):
  893. if not self._use_bin_type:
  894. return self._pack_raw_header(n)
  895. elif n <= 0xff:
  896. return self._buffer.write(struct.pack('>BB', 0xc4, n))
  897. elif n <= 0xffff:
  898. return self._buffer.write(struct.pack(">BH", 0xc5, n))
  899. elif n <= 0xffffffff:
  900. return self._buffer.write(struct.pack(">BI", 0xc6, n))
  901. else:
  902. raise ValueError('Bin is too large')
  903. def bytes(self):
  904. """Return internal buffer contents as bytes object"""
  905. return self._buffer.getvalue()
  906. def reset(self):
  907. """Reset internal buffer.
  908. This method is usaful only when autoreset=False.
  909. """
  910. self._buffer = StringIO()
  911. def getbuffer(self):
  912. """Return view of internal buffer."""
  913. if USING_STRINGBUILDER or PY2:
  914. return memoryview(self.bytes())
  915. else:
  916. return self._buffer.getbuffer()