Exemple #1
0
 def test_unpack(self):
     x = Writer(6)
     x.pack('>hI', 0x0c, 0xafebabe0)
     self.assertEqual(x.written, 6)
     self.assertEqual(str(x), '000cafebabe0')
     y = Reader(x.render())
     self.assertEqual(y.offset, 0)
     self.assertEqual(y.unpack('>hI'), (0x0c, 0xafebabe0))
     self.assertEqual(y.offset, 6)
Exemple #2
0
 def test_skipVarint(self):
     x = Writer(12)
     x.writeVarint(0xfa)
     x.writeVarint(0xff)
     x.writeVarint(0xcccc)
     x.writeVarint(0xaaaabbbb)
     self.assertEqual(x.written, 12)
     self.assertEqual(str(x), "fafdff00fdccccfebbbbaaaa")
     y = Reader(x.render())
     for e in [1, 4, 7, 12]:
         y.skipVarint()
         self.assertEqual(y.offset, e)
Exemple #3
0
 def test_bytes(self):
     x = Writer(420)
     x.writeBytes('\xfa')
     x.writeVarBytes('\xca' '\xfe' '\xba' '\xbe')
     x.writeVarBytes('\x01' * 0x19b)
     self.assertEqual(x.written, 420)
     self.assertEqual(str(x), 'fa04cafebabefd9b01' + '01' * 0x19b)
     y = Reader(x.render())
     self.assertEqual(y.offset, 0)
     self.assertEqual(y.readBytes(1), '\xfa')
     self.assertEqual(y.readVarBytes(), '\xca' '\xfe' '\xba' '\xbe')
     self.assertEqual(y.readVarBytes(), '\x01' * 0x19b)
     self.assertEqual(y.offset, 420)
Exemple #4
0
    def fromRaw(self, type, data):
        print "RAW:"
        self.type = type
        self.id = 0
        self.event = ''
        self.payload = None  #[]
        self.code = 0
        self.msg = ''
        self.br = Reader(data)
        print " FROM RAW CALL:[{}] {}.".format(type, hexify(data))

        if type == self.types['EVENT']:
            size = self.br.readU8()
            self.event = self.br.readString('ascii', size)
            # print " FROM RAW CALL:[{}] {}.".format(size, self.event)
            print " EVT: {}".format(self.event)
            # count = br.readU8()
            size = self.br.readVarint()
            print " SIZE: {}".format(size)
            self.payload = self.br.readBytes(size)
            print " PAYLOAD: {}".format(self.payload)
        elif type == self.types['CALL']:
            size = self.br.readU8()
            self.event = self.br.readString('ascii', size)
            # print " FROM RAW CALL:[{}] {}.".format(size, self.event)
            print " EVT: {}".format(self.event)
            self.id = self.br.readU32()
            # count = br.readU8()
            size = self.br.readVarint()
            print " SIZE: {}".format(size)
            self.payload = self.br.readBytes(size)
            print " PAYLOAD: {}".format(self.payload)
        elif type == self.types['ACK']:
            self.id = self.br.readU32()
            size = self.br.readVarint()
            self.payload = self.br.readBytes(size)
        elif type == self.types['ERROR']:
            self.id = br.readU32()
            self.code = self.br.readU8()
            size = self.br.readU8()
            #TODO: make payload?
            self.msg = self.br.readString('acii', size)
        # elif type in (self.types['PING'], self.types['PONG']):
        elif type == self.types['PING']:
            self.payload = self.br.readBytes(8)
        elif type == self.types['PONG']:
            self.payload = self.br.readU64()
        else:
            raise "Unknown Packet Type"

        return self
Exemple #5
0
 def test_varint(self):
     x = Writer(12)
     x.writeVarint(0xfa)
     x.writeVarint(0xff)
     x.writeVarint(0xcccc)
     x.writeVarint(0xaaaabbbb)
     self.assertEqual(x.written, 12)
     self.assertEqual(str(x), "fafdff00fdccccfebbbbaaaa")
     y = Reader(x.render())
     self.assertEqual(y.readVarint(), 0xfa)
     self.assertEqual(y.readVarint(), 0xff)
     self.assertEqual(y.readVarint(), 0xcccc)
     self.assertEqual(y.readVarint(), 0xaaaabbbb)
     self.assertEqual(y.offset, 12)
Exemple #6
0
 def test_double(self):
     x = Writer(24)
     x.writeDouble(0xdeadbeefcafebabe)
     x.writeDoubleBE(0xdeadbeefcafebabe)
     x.writeDouble(1.0 / 3.0)
     self.assertEqual(
         str(x), 'd75ff9ddb7d5eb43'
         '43ebd5b7ddf95fd7'
         '555555555555d53f')
     y = Reader(x.render())
     self.assertEqual(y.offset, 0)
     self.assertEqual(y.readDouble(), float(0xdeadbeefcafebabe))
     self.assertEqual(y.readDoubleBE(), float(0xdeadbeefcafebabe))
     self.assertEqual(y.readDouble(), 1.0 / 3.0)
     self.assertEqual(y.offset, 24)
Exemple #7
0
 def test_string(self):
     x = Writer(22)
     x.writeString("cool", 'ascii')
     x.writeString(u"\u263a", 'utf-8')
     x.writeVarString("cool", 'ascii')
     x.writeVarString(u"\u263a" * 3, 'utf-8')
     self.assertEqual(x.written, 22)
     self.assertEqual(
         str(x), '636f6f6c'
         'e298ba'
         '04636f6f6c'
         '09e298bae298bae298ba')
     y = Reader(x.render())
     self.assertEqual(y.offset, 0)
     self.assertEqual(y.readString('ascii', 4), "cool")
     self.assertEqual(y.readString('utf-8', 3), u'\u263a')
     self.assertEqual(y.readVarString('ascii'), 'cool')
     self.assertEqual(y.readVarString('utf-8'), u'\u263a' * 3)
     self.assertEqual(y.offset, 22)
Exemple #8
0
    class Header():
        # type = 0
        # size = 0
        # checksum = 0
        #
        def __init__(self, data=None):
            if data:
                # print " PH_DATA:{}".format(hexify(bytearray(data)))
                self.br = Reader(data)
                self.type = self.br.readU8()
                self.size = self.br.readU32()
                # self.checksum = self.br.readU32()
                # print "HEADER: {}".format(self.__dict__)

        # def fromRaw(self, data):
        #     br = Reader(data)
        #     self.type = br.readU8()
        #     self.size = br.readU32()
        #     return self

        def __str__(self):
            return "<packet.Header[{}] size:{}>".format(self.type, self.size)
Exemple #9
0
class Packet():
    types = {
        'CALL': 0,
        'EVENT': 1,
        'ACK': 2,
        'ERROR': 3,
        'PING': 4,
        'PONG': 5,
    }

    class Header():
        # type = 0
        # size = 0
        # checksum = 0
        #
        def __init__(self, data=None):
            if data:
                # print " PH_DATA:{}".format(hexify(bytearray(data)))
                self.br = Reader(data)
                self.type = self.br.readU8()
                self.size = self.br.readU32()
                # self.checksum = self.br.readU32()
                # print "HEADER: {}".format(self.__dict__)

        # def fromRaw(self, data):
        #     br = Reader(data)
        #     self.type = br.readU8()
        #     self.size = br.readU32()
        #     return self

        def __str__(self):
            return "<packet.Header[{}] size:{}>".format(self.type, self.size)

    def __init__(self):
        self.type = 0
        self.id = 0
        self.event = ''
        self.payload = None  #[]
        self.code = 0
        self.msg = ''

    def fromRaw(self, type, data):
        print "RAW:"
        self.type = type
        self.id = 0
        self.event = ''
        self.payload = None  #[]
        self.code = 0
        self.msg = ''
        self.br = Reader(data)
        print " FROM RAW CALL:[{}] {}.".format(type, hexify(data))

        if type == self.types['EVENT']:
            size = self.br.readU8()
            self.event = self.br.readString('ascii', size)
            # print " FROM RAW CALL:[{}] {}.".format(size, self.event)
            print " EVT: {}".format(self.event)
            # count = br.readU8()
            size = self.br.readVarint()
            print " SIZE: {}".format(size)
            self.payload = self.br.readBytes(size)
            print " PAYLOAD: {}".format(self.payload)
        elif type == self.types['CALL']:
            size = self.br.readU8()
            self.event = self.br.readString('ascii', size)
            # print " FROM RAW CALL:[{}] {}.".format(size, self.event)
            print " EVT: {}".format(self.event)
            self.id = self.br.readU32()
            # count = br.readU8()
            size = self.br.readVarint()
            print " SIZE: {}".format(size)
            self.payload = self.br.readBytes(size)
            print " PAYLOAD: {}".format(self.payload)
        elif type == self.types['ACK']:
            self.id = self.br.readU32()
            size = self.br.readVarint()
            self.payload = self.br.readBytes(size)
        elif type == self.types['ERROR']:
            self.id = br.readU32()
            self.code = self.br.readU8()
            size = self.br.readU8()
            #TODO: make payload?
            self.msg = self.br.readString('acii', size)
        # elif type in (self.types['PING'], self.types['PONG']):
        elif type == self.types['PING']:
            self.payload = self.br.readBytes(8)
        elif type == self.types['PONG']:
            self.payload = self.br.readU64()
        else:
            raise "Unknown Packet Type"

        return self

    def getSize(self):
        size = 0
        if self.type == Packet.types['EVENT']:
            size += 1
            size += len(self.event)
            # size += 1
            # for i in self.payload:
            #     size += encoding.sizeVarint(len(i))
            #     size += len(i)  #TODO:
            size += encoding.sizeVarint(len(self.payload))
            size += len(self.payload)  #TODO:
        elif self.type == Packet.types['CALL']:
            size += 1
            size += len(self.event)
            size += 4
            # size += 1
            # for i in self.payload:
            #     size += encoding.sizeVarint(len(i))
            #     size += len(i)  #TODO:
            size += encoding.sizeVarint(len(self.payload))
            size += len(self.payload)  #TODO:
        elif self.type == Packet.types['ACK']:
            size += 4
            # size += 1
            # for i in self.payload:
            #     size += encoding.sizeVarint(len(i))
            #     size += len(i)  #TODO:
            size += encoding.sizeVarint(len(self.payload))
            size += len(self.payload)  #TODO:
        #TODO:
        elif self.type == self.types['ERROR']:
            size += 4
            size += 1
            size += 1
            size += len(self.msg)
        elif self.type in (self.types['PING'], self.types['PONG']):
            size += 8
        # elif self.type == self.types['PONG']:
        else:
            raise Exception("Unknown message type: {}.".format(self.type))
        return size

    # to_bytes
    def frame(self):
        size = self.getSize()
        # print " self: {}".format(self.__dict__)
        # print " FRAME: size={}".format(size)
        bw = Writer(size + 9)
        # i, item, data
        # write header
        bw.writeU8(self.type)
        bw.writeU32(size)
        bw.writeU32(0)

        if self.type == Packet.types['EVENT']:
            bw.writeU8(len(self.event))
            bw.writeString(self.event, 'ascii')
            # bw.writeU8(len(self.payload))
            # for item in self.payload:
            # bw.writeVarint(len(item))
            # bw.writeBytes(item)
            bw.writeVarint(len(self.payload))
            bw.writeBytes(self.payload)
        elif self.type == Packet.types['CALL']:
            print " FRAME_CALL: {}".format(self.__dict__)
            bw.writeU8(len(self.event))
            bw.writeString(self.event, 'ascii')
            bw.writeU32(self.id)
            # bw.writeU8(len(self.payload))
            # for item in self.payload:
            #     bw.writeVarint(len(item))
            #     bw.writeBytes(item)
            bw.writeVarint(len(self.payload))
            bw.writeBytes(self.payload)
        elif self.type == Packet.types['ACK']:
            bw.writeU32(self.id)
            # bw.writeU8(len(self.payload))
            ####
            bw.writeVarint(len(self.payload))
            bw.writeBytes(self.payload)
        elif self.type == Packet.types['ERROR']:
            bw.writeU32(self.id)
            bw.writeU8(self.code)
            bw.writeU8(len(self.msg))
            bw.writeString(self.msg, 'ascii')
        # elif self.type in (Packet.types['PING'], Packet.types['PONG']):
        elif self.type == Packet.types['PING']:
            bw.writeU64(self.payload)
        elif self.type == Packet.types['PONG']:
            bw.writeBytes(self.payload)
        else:
            raise Exception("Unknown message type {}.".format(self.type))

        data = bw.render()
        # print " DDDD: {}".format(data)
        #TODO: checksum
        return data
Exemple #10
0
 def __init__(self, data=None):
     if data:
         # print " PH_DATA:{}".format(hexify(bytearray(data)))
         self.br = Reader(data)
         self.type = self.br.readU8()
         self.size = self.br.readU32()
Exemple #11
0
    def test_int(self):
        x = Writer(58)
        x.write8(-0x0c)
        x.writeU8(0xfa)
        x.write16(-0x1234)
        x.write16BE(-0x1234)
        x.writeU16(0x1234)
        x.writeU16BE(0x1234)
        x.write32(-0x0aaabbbb)
        x.write32BE(-0x0aaabbbb)
        x.writeU32(0xccccdddd)
        x.writeU32BE(0xccccdddd)
        x.write64(-0x0123456789abcdef)
        x.write64BE(-0x0123456789abcdef)
        x.writeU64(0x0123456789abcdef)
        x.writeU64BE(0x0123456789abcdef)

        self.assertEqual(x.written, 58)
        self.assertEqual(
            str(x),
            "f4faccededcc34121234454455f5f5554445ddddccccccccdddd1132547698badcfefedcba9876543211efcdab89674523010123456789abcdef"
        )
        y = Reader(x.render())
        self.assertEqual(y.offset, 0)
        self.assertEqual(y.read8(), -0x0c)
        self.assertEqual(y.readU8(), 0xfa)
        self.assertEqual(y.read16(), -0x1234)
        self.assertEqual(y.read16BE(), -0x1234)
        self.assertEqual(y.readU16(), 0x1234)
        self.assertEqual(y.readU16BE(), 0x1234)
        self.assertEqual(y.read32(), -0x0aaabbbb)
        self.assertEqual(y.read32BE(), -0x0aaabbbb)
        self.assertEqual(y.readU32(), 0xccccdddd)
        self.assertEqual(y.readU32BE(), 0xccccdddd)
        self.assertEqual(y.read64(), -0x0123456789abcdef)
        self.assertEqual(y.read64BE(), -0x0123456789abcdef)
        self.assertEqual(y.readU64(), 0x0123456789abcdef)
        self.assertEqual(y.readU64BE(), 0x0123456789abcdef)
        self.assertEqual(y.offset, 58)
Exemple #12
0
 def test_combined(self):
     x = Writer(45)
     x.writeU8(0xfa)
     x.writeU8(0xcc)
     x.writeU16(0x1234)
     x.writeU16BE(0x1234)
     x.writeU32(0xaaaabbbb)
     x.writeU32BE(0xccccdddd)
     x.writeU64(0x0123456789abcdef)
     x.writeVarint(0xfa)
     x.writeVarint(0xff)
     x.writeVarint(0xcccc)
     x.writeVarint(0xaaaabbbb)
     x.writeString("cool", 'ascii')
     x.writeString(u"\u263a", 'utf-8')
     x.writeBytes('\x01' * 3)
     x.writeU8(0xfa)
     # print(" Writer: {}".format(x))
     self.assertEqual(
         str(x),
         "facc34121234bbbbaaaaccccddddefcdab8967452301fafdff00fdccccfebbbbaaaa636f6f6ce298ba010101fa"
     )
     y = Reader(x.render())
     self.assertEqual(y.offset, 0)
     self.assertEqual(y.readU8(), 0xfa)
     self.assertEqual(y.readU8(), 0xcc)
     self.assertEqual(y.readU16(), 0x1234)
     self.assertEqual(y.readU16BE(), 0x1234)
     self.assertEqual(y.readU32(), 0xaaaabbbb)
     self.assertEqual(y.readU32BE(), 0xccccdddd)
     self.assertEqual(y.readU64(), 0x0123456789abcdef)
     self.assertEqual(y.readVarint(), 0xfa)
     self.assertEqual(y.readVarint(), 0xff)
     self.assertEqual(y.readVarint(), 0xcccc)
     self.assertEqual(y.readVarint(), 0xaaaabbbb)
     self.assertEqual(y.readString('ascii', 4), 'cool')
     self.assertEqual(y.readString('utf-8', 3), u'\u263a')
     self.assertEqual(y.readBytes(3), '\x01' * 3)
     self.assertEqual(y.readU8(), 0xfa)
     self.assertEqual(y.offset, 45)
     y.seek(-y.offset)
     self.assertEqual(y.offset, 0)