comparison lib/python3.8/site-packages/pip/_vendor/msgpack/fallback.py @ 0:9e54283cc701 draft

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