Ejemplo n.º 1
0
    def serialize_safe(cls, items, protocol_version):
        if isinstance(items, six.string_types):
            raise TypeError("Received a string for a type that expects a sequence")

        subtype, = cls.subtypes
        buf = io.BytesIO()
        buf.write(int32_pack(len(items)))
        inner_proto = max(3, protocol_version)
        for item in items:
            itembytes = subtype.to_binary(item, inner_proto)
            buf.write(int32_pack(len(itembytes)))
            buf.write(itembytes)
        return buf.getvalue()
Ejemplo n.º 2
0
    def serialize_safe(cls, val, protocol_version):
        if len(val) > len(cls.subtypes):
            raise ValueError("Expected %d items in a tuple, but got %d: %s" %
                             (len(cls.subtypes), len(val), val))

        proto_version = max(3, protocol_version)
        buf = io.BytesIO()
        for item, subtype in zip(val, cls.subtypes):
            if item is not None:
                packed_item = subtype.to_binary(item, proto_version)
                buf.write(int32_pack(len(packed_item)))
                buf.write(packed_item)
            else:
                buf.write(int32_pack(-1))
        return buf.getvalue()
    def test_eagain_on_buffer_size(self, *args):
        # get a connection that's already fully started
        c = self.test_successful_connection()

        # Testing with v3, minimum supported version
        header = six.b('\x03') + uint16_pack(0) + six.b('\x00\x00') + int32_pack(20000)
        responses = [
            header + (six.b('a') * (4096 - len(header))),
            six.b('a') * 4096,
            socket_error(errno.EAGAIN),
            six.b('a') * 100,
            socket_error(errno.EAGAIN)]

        def side_effect(*args):
            response = responses.pop(0)
            if isinstance(response, socket_error):
                raise response
            else:
                return response

        c._socket.recv.side_effect = side_effect
        c.handle_read(None, 0)
        self.assertEqual(c._current_frame.end_pos, 20000 + len(header))
        # the EAGAIN prevents it from reading the last 100 bytes
        c._iobuf.seek(0, os.SEEK_END)
        pos = c._iobuf.tell()
        self.assertEqual(pos, 4096 + 4096)

        # now tell it to read the last 100 bytes
        c.handle_read(None, 0)
        c._iobuf.seek(0, os.SEEK_END)
        pos = c._iobuf.tell()
        self.assertEqual(pos, 4096 + 4096 + 100)
Ejemplo n.º 4
0
    def serialize_safe(cls, val, protocol_version):
        proto_version = max(3, protocol_version)
        buf = io.BytesIO()
        for i, (fieldname, subtype) in enumerate(zip(cls.fieldnames, cls.subtypes)):
            # first treat as a tuple, else by custom type
            try:
                item = val[i]
            except TypeError:
                item = getattr(val, fieldname)

            if item is not None:
                packed_item = subtype.to_binary(item, proto_version)
                buf.write(int32_pack(len(packed_item)))
                buf.write(packed_item)
            else:
                buf.write(int32_pack(-1))
        return buf.getvalue()
Ejemplo n.º 5
0
 def serialize_safe(cls, themap, protocol_version):
     key_type, value_type = cls.subtypes
     buf = io.BytesIO()
     buf.write(int32_pack(len(themap)))
     try:
         items = six.iteritems(themap)
     except AttributeError:
         raise TypeError("Got a non-map object for a map value")
     inner_proto = max(3, protocol_version)
     for key, val in items:
         keybytes = key_type.to_binary(key, inner_proto)
         valbytes = value_type.to_binary(val, inner_proto)
         buf.write(int32_pack(len(keybytes)))
         buf.write(keybytes)
         buf.write(int32_pack(len(valbytes)))
         buf.write(valbytes)
     return buf.getvalue()
Ejemplo n.º 6
0
 def serialize(dec, protocol_version):
     try:
         sign, digits, exponent = dec.as_tuple()
     except AttributeError:
         try:
             sign, digits, exponent = Decimal(dec).as_tuple()
         except Exception:
             raise TypeError("Invalid type for Decimal value: %r", dec)
     unscaled = int(''.join([str(digit) for digit in digits]))
     if sign:
         unscaled *= -1
     scale = int32_pack(-exponent)
     unscaled = varint_pack(unscaled)
     return scale + unscaled
    def test_negative_body_length(self, *args):
        c = self.make_connection()
        c._requests = Mock()
        c.defunct = Mock()

        # read in a SupportedMessage response
        header = self.make_header_prefix(SupportedMessage)
        message = header + int32_pack(-13)
        c._iobuf = BytesIO()
        c._iobuf.write(message)
        c.process_io_buffer()

        # make sure it errored correctly
        c.defunct.assert_called_once_with(ANY)
        args, kwargs = c.defunct.call_args
        self.assertIsInstance(args[0], ProtocolError)
Ejemplo n.º 8
0
def write_int(f, i):
    f.write(int32_pack(i))
Ejemplo n.º 9
0
 def serialize(byts, protocol_version):
     return int32_pack(byts)
Ejemplo n.º 10
0
 def lz4_compress(byts):
     # write length in big-endian instead of little-endian
     return int32_pack(len(byts)) + lz4.compress(byts)[4:]