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)
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 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)
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