Пример #1
0
 def pack_ext_type(self, typecode, data):
     if not isinstance(typecode, int):
         raise TypeError("typecode must have int type.")
     if not 0 <= typecode <= 127:
         raise ValueError("typecode should be 0-127")
     if not isinstance(data, bytes):
         raise TypeError("data must have bytes type")
     L = len(data)
     if L > 0xffffffff:
         raise PackValueError("Too large data")
     if L == 1:
         self._buffer.write(b'\xd4')
     elif L == 2:
         self._buffer.write(b'\xd5')
     elif L == 4:
         self._buffer.write(b'\xd6')
     elif L == 8:
         self._buffer.write(b'\xd7')
     elif L == 16:
         self._buffer.write(b'\xd8')
     elif L <= 0xff:
         self._buffer.write(b'\xc7' + struct.pack('B', L))
     elif L <= 0xffff:
         self._buffer.write(b'\xc8' + struct.pack('>H', L))
     else:
         self._buffer.write(b'\xc9' + struct.pack('>I', L))
     self._buffer.write(struct.pack('B', typecode))
     self._buffer.write(data)
Пример #2
0
 def _pack_map_header(self, n):
     if n <= 0x0f:
         return self._buffer.write(struct.pack('B', 0x80 + n))
     if n <= 0xffff:
         return self._buffer.write(struct.pack(">BH", 0xde, n))
     if n <= 0xffffffff:
         return self._buffer.write(struct.pack(">BI", 0xdf, n))
     raise PackValueError("Dict is too large")
Пример #3
0
 def _pack_array_header(self, n):
     if n <= 0x0f:
         return self._buffer.write(struct.pack('B', 0x90 + n))
     if n <= 0xffff:
         return self._buffer.write(struct.pack(">BH", 0xdc, n))
     if n <= 0xffffffff:
         return self._buffer.write(struct.pack(">BI", 0xdd, n))
     raise PackValueError("Array is too large")
Пример #4
0
 def _pack_bin_header(self, n):
     if not self._use_bin_type:
         return self._pack_raw_header(n)
     elif n <= 0xff:
         return self._buffer.write(struct.pack('>BB', 0xc4, n))
     elif n <= 0xffff:
         return self._buffer.write(struct.pack(">BH", 0xc5, n))
     elif n <= 0xffffffff:
         return self._buffer.write(struct.pack(">BI", 0xc6, n))
     else:
         raise PackValueError('Bin is too large')
Пример #5
0
 def _pack_raw_header(self, n):
     if n <= 0x1f:
         self._buffer.write(struct.pack('B', 0xa0 + n))
     elif self._use_bin_type and n <= 0xff:
         self._buffer.write(struct.pack('>BB', 0xd9, n))
     elif n <= 0xffff:
         self._buffer.write(struct.pack(">BH", 0xda, n))
     elif n <= 0xffffffff:
         self._buffer.write(struct.pack(">BI", 0xdb, n))
     else:
         raise PackValueError('Raw is too large')
Пример #6
0
 def _pack(self,
           obj,
           nest_limit=DEFAULT_RECURSE_LIMIT,
           check=isinstance,
           check_type_strict=_check_type_strict):
     default_used = False
     if self._strict_types:
         check = check_type_strict
         list_types = list
     else:
         list_types = (list, tuple)
     while True:
         if nest_limit < 0:
             raise PackValueError("recursion limit exceeded")
         if obj is None:
             return self._buffer.write(b"\xc0")
         if check(obj, bool):
             if obj:
                 return self._buffer.write(b"\xc3")
             return self._buffer.write(b"\xc2")
         if check(obj, int_types):
             if 0 <= obj < 0x80:
                 return self._buffer.write(struct.pack("B", obj))
             if -0x20 <= obj < 0:
                 return self._buffer.write(struct.pack("b", obj))
             if 0x80 <= obj <= 0xff:
                 return self._buffer.write(struct.pack("BB", 0xcc, obj))
             if -0x80 <= obj < 0:
                 return self._buffer.write(struct.pack(">Bb", 0xd0, obj))
             if 0xff < obj <= 0xffff:
                 return self._buffer.write(struct.pack(">BH", 0xcd, obj))
             if -0x8000 <= obj < -0x80:
                 return self._buffer.write(struct.pack(">Bh", 0xd1, obj))
             if 0xffff < obj <= 0xffffffff:
                 return self._buffer.write(struct.pack(">BI", 0xce, obj))
             if -0x80000000 <= obj < -0x8000:
                 return self._buffer.write(struct.pack(">Bi", 0xd2, obj))
             if 0xffffffff < obj <= 0xffffffffffffffff:
                 return self._buffer.write(struct.pack(">BQ", 0xcf, obj))
             if -0x8000000000000000 <= obj < -0x80000000:
                 return self._buffer.write(struct.pack(">Bq", 0xd3, obj))
             if not default_used and self._default is not None:
                 obj = self._default(obj)
                 default_used = True
                 continue
             raise PackOverflowError("Integer value out of range")
         if check(obj, bytes):
             n = len(obj)
             if n >= 2**32:
                 raise PackValueError("Bytes is too large")
             self._pack_bin_header(n)
             return self._buffer.write(obj)
         if check(obj, Unicode):
             if self._encoding is None:
                 raise TypeError("Can't encode unicode string: "
                                 "no encoding is specified")
             obj = obj.encode(self._encoding, self._unicode_errors)
             n = len(obj)
             if n >= 2**32:
                 raise PackValueError("String is too large")
             self._pack_raw_header(n)
             return self._buffer.write(obj)
         if check(obj, memoryview):
             n = len(obj) * obj.itemsize
             if n >= 2**32:
                 raise PackValueError("Memoryview is too large")
             self._pack_bin_header(n)
             return self._buffer.write(obj)
         if check(obj, float):
             if self._use_float:
                 return self._buffer.write(struct.pack(">Bf", 0xca, obj))
             return self._buffer.write(struct.pack(">Bd", 0xcb, obj))
         if check(obj, ExtType):
             code = obj.code
             data = obj.data
             assert isinstance(code, int)
             assert isinstance(data, bytes)
             L = len(data)
             if L == 1:
                 self._buffer.write(b'\xd4')
             elif L == 2:
                 self._buffer.write(b'\xd5')
             elif L == 4:
                 self._buffer.write(b'\xd6')
             elif L == 8:
                 self._buffer.write(b'\xd7')
             elif L == 16:
                 self._buffer.write(b'\xd8')
             elif L <= 0xff:
                 self._buffer.write(struct.pack(">BB", 0xc7, L))
             elif L <= 0xffff:
                 self._buffer.write(struct.pack(">BH", 0xc8, L))
             else:
                 self._buffer.write(struct.pack(">BI", 0xc9, L))
             self._buffer.write(struct.pack("b", code))
             self._buffer.write(data)
             return
         if check(obj, list_types):
             n = len(obj)
             self._pack_array_header(n)
             for i in xrange(n):
                 self._pack(obj[i], nest_limit - 1)
             return
         if check(obj, dict):
             return self._pack_map_pairs(len(obj), dict_iteritems(obj),
                                         nest_limit - 1)
         if not default_used and self._default is not None:
             obj = self._default(obj)
             default_used = 1
             continue
         raise TypeError("Cannot serialize %r" % obj)
Пример #7
0
 def _pack(self,
           obj,
           nest_limit=DEFAULT_RECURSE_LIMIT,
           isinstance=isinstance):
     default_used = False
     while True:
         if nest_limit < 0:
             raise PackValueError("recursion limit exceeded")
         if obj is None:
             return self._buffer.write(b"\xc0")
         if isinstance(obj, bool):
             if obj:
                 return self._buffer.write(b"\xc3")
             return self._buffer.write(b"\xc2")
         if isinstance(obj, int_types):
             if 0 <= obj < 0x80:
                 return self._buffer.write(struct.pack("B", obj))
             if -0x20 <= obj < 0:
                 return self._buffer.write(struct.pack("b", obj))
             if 0x80 <= obj <= 0xff:
                 return self._buffer.write(struct.pack("BB", 0xcc, obj))
             if -0x80 <= obj < 0:
                 return self._buffer.write(struct.pack(">Bb", 0xd0, obj))
             if 0xff < obj <= 0xffff:
                 return self._buffer.write(struct.pack(">BH", 0xcd, obj))
             if -0x8000 <= obj < -0x80:
                 return self._buffer.write(struct.pack(">Bh", 0xd1, obj))
             if 0xffff < obj <= 0xffffffff:
                 return self._buffer.write(struct.pack(">BI", 0xce, obj))
             if -0x80000000 <= obj < -0x8000:
                 return self._buffer.write(struct.pack(">Bi", 0xd2, obj))
             if 0xffffffff < obj <= 0xffffffffffffffff:
                 return self._buffer.write(struct.pack(">BQ", 0xcf, obj))
             if -0x8000000000000000 <= obj < -0x80000000:
                 return self._buffer.write(struct.pack(">Bq", 0xd3, obj))
             raise PackValueError("Integer value out of range")
         if self._use_bin_type and isinstance(obj, bytes):
             n = len(obj)
             if n <= 0xff:
                 self._buffer.write(struct.pack('>BB', 0xc4, n))
             elif n <= 0xffff:
                 self._buffer.write(struct.pack(">BH", 0xc5, n))
             elif n <= 0xffffffff:
                 self._buffer.write(struct.pack(">BI", 0xc6, n))
             else:
                 raise PackValueError("Bytes is too large")
             return self._buffer.write(obj)
         if isinstance(obj, (Unicode, bytes)):
             if isinstance(obj, Unicode):
                 if self._encoding is None:
                     raise TypeError("Can't encode unicode string: "
                                     "no encoding is specified")
                 obj = obj.encode(self._encoding, self._unicode_errors)
             n = len(obj)
             if n <= 0x1f:
                 self._buffer.write(struct.pack('B', 0xa0 + n))
             elif self._use_bin_type and n <= 0xff:
                 self._buffer.write(struct.pack('>BB', 0xd9, n))
             elif n <= 0xffff:
                 self._buffer.write(struct.pack(">BH", 0xda, n))
             elif n <= 0xffffffff:
                 self._buffer.write(struct.pack(">BI", 0xdb, n))
             else:
                 raise PackValueError("String is too large")
             return self._buffer.write(obj)
         if isinstance(obj, float):
             if self._use_float:
                 return self._buffer.write(struct.pack(">Bf", 0xca, obj))
             return self._buffer.write(struct.pack(">Bd", 0xcb, obj))
         if isinstance(obj, ExtType):
             code = obj.code
             data = obj.data
             assert isinstance(code, int)
             assert isinstance(data, bytes)
             L = len(data)
             if L == 1:
                 self._buffer.write(b'\xd4')
             elif L == 2:
                 self._buffer.write(b'\xd5')
             elif L == 4:
                 self._buffer.write(b'\xd6')
             elif L == 8:
                 self._buffer.write(b'\xd7')
             elif L == 16:
                 self._buffer.write(b'\xd8')
             elif L <= 0xff:
                 self._buffer.write(struct.pack(">BB", 0xc7, L))
             elif L <= 0xffff:
                 self._buffer.write(struct.pack(">BH", 0xc8, L))
             else:
                 self._buffer.write(struct.pack(">BI", 0xc9, L))
             self._buffer.write(struct.pack("b", code))
             self._buffer.write(data)
             return
         if isinstance(obj, (list, tuple)) and not hasattr(obj, '_asdict'):
             n = len(obj)
             self._fb_pack_array_header(n)
             for i in xrange(n):
                 self._pack(obj[i], nest_limit - 1)
             return
         if isinstance(obj, dict):
             return self._fb_pack_map_pairs(len(obj), dict_iteritems(obj),
                                            nest_limit - 1)
         if not default_used and self._default is not None:
             obj = self._default(obj)
             default_used = 1
             continue
         raise TypeError("Cannot serialize %r" % obj)
Пример #8
0
 def _pack(self,
           obj,
           nest_limit=DEFAULT_RECURSE_LIMIT,
           isinstance=isinstance):
     if nest_limit < 0:
         raise PackValueError("recursion limit exceeded")
     if obj is None:
         return self._buffer.write(b"\xc0")
     if isinstance(obj, bool):
         if obj:
             return self._buffer.write(b"\xc3")
         return self._buffer.write(b"\xc2")
     if isinstance(obj, int_types):
         if 0 <= obj < 0x80:
             return self._buffer.write(struct.pack("B", obj))
         if -0x20 <= obj < 0:
             return self._buffer.write(struct.pack("b", obj))
         if 0x80 <= obj <= 0xff:
             return self._buffer.write(struct.pack("BB", 0xcc, obj))
         if -0x80 <= obj < 0:
             return self._buffer.write(struct.pack(">Bb", 0xd0, obj))
         if 0xff < obj <= 0xffff:
             return self._buffer.write(struct.pack(">BH", 0xcd, obj))
         if -0x8000 <= obj < -0x80:
             return self._buffer.write(struct.pack(">Bh", 0xd1, obj))
         if 0xffff < obj <= 0xffffffff:
             return self._buffer.write(struct.pack(">BI", 0xce, obj))
         if -0x80000000 <= obj < -0x8000:
             return self._buffer.write(struct.pack(">Bi", 0xd2, obj))
         if 0xffffffff < obj <= 0xffffffffffffffff:
             return self._buffer.write(struct.pack(">BQ", 0xcf, obj))
         if -0x8000000000000000 <= obj < -0x80000000:
             return self._buffer.write(struct.pack(">Bq", 0xd3, obj))
         raise PackValueError("Integer value out of range")
     if isinstance(obj, (Unicode, bytes)):
         if isinstance(obj, Unicode):
             if self._encoding is None:
                 raise TypeError("Can't encode unicode string: "
                                 "no encoding is specified")
             obj = obj.encode(self._encoding, self._unicode_errors)
         n = len(obj)
         if n <= 0x1f:
             self._buffer.write(struct.pack('B', 0xa0 + n))
             return self._buffer.write(obj)
         if n <= 0xffff:
             self._buffer.write(struct.pack(">BH", 0xda, n))
             return self._buffer.write(obj)
         if n <= 0xffffffff:
             self._buffer.write(struct.pack(">BI", 0xdb, n))
             return self._buffer.write(obj)
         raise PackValueError("String is too large")
     if isinstance(obj, float):
         if self._use_float:
             return self._buffer.write(struct.pack(">Bf", 0xca, obj))
         return self._buffer.write(struct.pack(">Bd", 0xcb, obj))
     if isinstance(obj, list) or isinstance(obj, tuple):
         n = len(obj)
         self._fb_pack_array_header(n)
         for i in xrange(n):
             self._pack(obj[i], nest_limit - 1)
         return
     if isinstance(obj, dict):
         return self._fb_pack_map_pairs(len(obj), dict_iteritems(obj),
                                        nest_limit - 1)
     if self._default is not None:
         return self._pack(self._default(obj), nest_limit - 1)
     raise TypeError("Cannot serialize %r" % obj)
Пример #9
0
    cdef int _pack(self, object o, int nest_limit=DEFAULT_RECURSE_LIMIT) except -1:
        cdef long long llval
        cdef unsigned long long ullval
        cdef long longval
        cdef float fval
        cdef double dval
        cdef char* rawval
        cdef int ret
        cdef dict d
        cdef Py_ssize_t L
        cdef int default_used = 0
        cdef bint strict_types = self.strict_types
        cdef Py_buffer view

        if nest_limit < 0:
            raise PackValueError("recursion limit exceeded.")

        while True:
            if o is None:
                ret = msgpack_pack_nil(&self.pk)

            elif PyBytesLike_CheckExact(o) if strict_types else PyBytesLike_Check(o):
                #this is a python byte array
                L = len(o)
                if L > ITEM_LIMIT:
                    raise PackValueError("%s is too large" % type(o).__name__)
                rawval = o
                #ret = msgpack_pack_bin(&self.pk, L)
                #we don't have a special type for binary, so lets skip this and use the same function as unicode
                if L == 1 and ord(o) < 0x80:
                    print('encoding single byte as is')