Extended encoding update
- modified to support both encoding and decoding - fixes - added test for all encodings
This commit is contained in:
parent
4af788e963
commit
2fc2c78299
|
@ -1,10 +1,10 @@
|
||||||
#!/usr/bin/python2.7
|
#!/usr/bin/python2.7
|
||||||
|
|
||||||
import string
|
|
||||||
import msgpack
|
import msgpack
|
||||||
|
import string
|
||||||
import zlib
|
import zlib
|
||||||
|
|
||||||
from debug import logger
|
import shared
|
||||||
import messagetypes
|
import messagetypes
|
||||||
|
|
||||||
BITMESSAGE_ENCODING_IGNORE = 0
|
BITMESSAGE_ENCODING_IGNORE = 0
|
||||||
|
@ -12,7 +12,6 @@ BITMESSAGE_ENCODING_TRIVIAL = 1
|
||||||
BITMESSAGE_ENCODING_SIMPLE = 2
|
BITMESSAGE_ENCODING_SIMPLE = 2
|
||||||
BITMESSAGE_ENCODING_EXTENDED = 3
|
BITMESSAGE_ENCODING_EXTENDED = 3
|
||||||
|
|
||||||
|
|
||||||
class MsgEncode(object):
|
class MsgEncode(object):
|
||||||
def __init__(self, message, encoding=BITMESSAGE_ENCODING_SIMPLE):
|
def __init__(self, message, encoding=BITMESSAGE_ENCODING_SIMPLE):
|
||||||
self.data = None
|
self.data = None
|
||||||
|
@ -27,7 +26,8 @@ class MsgEncode(object):
|
||||||
|
|
||||||
def encodeExtended(self, message):
|
def encodeExtended(self, message):
|
||||||
try:
|
try:
|
||||||
self.data = zlib.compress(msgpack.dumps({"": "message", "subject": message['subject'], "message": ['body']}), 9)
|
msgObj = messagetypes.message.Message()
|
||||||
|
self.data = zlib.compress(msgpack.dumps(msgObj.encode(message)), 9)
|
||||||
except zlib.error:
|
except zlib.error:
|
||||||
logger.error("Error compressing message")
|
logger.error("Error compressing message")
|
||||||
raise
|
raise
|
||||||
|
@ -70,14 +70,14 @@ class MsgDecode(object):
|
||||||
logger.error("Message type missing")
|
logger.error("Message type missing")
|
||||||
raise
|
raise
|
||||||
|
|
||||||
msgObj = messagetypes.constructObject(data)
|
msgObj = messagetypes.constructObject(tmp)
|
||||||
if msgObj is None:
|
if msgObj is None:
|
||||||
raise ValueError("Malformed message")
|
raise ValueError("Malformed message")
|
||||||
try:
|
try:
|
||||||
msgObj.process()
|
msgObj.process()
|
||||||
except:
|
except:
|
||||||
raise ValueError("Malformed message")
|
raise ValueError("Malformed message")
|
||||||
if msgType[""] == "message":
|
if msgType == "message":
|
||||||
self.subject = msgObj.subject
|
self.subject = msgObj.subject
|
||||||
self.body = msgObj.body
|
self.body = msgObj.body
|
||||||
|
|
||||||
|
@ -96,4 +96,25 @@ class MsgDecode(object):
|
||||||
if subject:
|
if subject:
|
||||||
subject = subject.splitlines()[0]
|
subject = subject.splitlines()[0]
|
||||||
self.subject = subject
|
self.subject = subject
|
||||||
self.message = body
|
self.body = body
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
import random
|
||||||
|
messageData = {
|
||||||
|
"subject": ''.join(random.choice(string.ascii_lowercase + string.digits) for _ in range(40)),
|
||||||
|
"body": ''.join(random.choice(string.ascii_lowercase + string.digits) for _ in range(10000))
|
||||||
|
}
|
||||||
|
obj1 = MsgEncode(messageData, 1)
|
||||||
|
obj2 = MsgEncode(messageData, 2)
|
||||||
|
obj3 = MsgEncode(messageData, 3)
|
||||||
|
print "1:%i 2:%i 3:%i" %(len(obj1.data), len(obj2.data), len(obj3.data))
|
||||||
|
|
||||||
|
obj1e = MsgDecode(1, obj1.data)
|
||||||
|
# no subject in trivial encoding
|
||||||
|
assert messageData["body"] == obj1e.body
|
||||||
|
obj2e = MsgDecode(2, obj2.data)
|
||||||
|
assert messageData["subject"] == obj2e.subject
|
||||||
|
assert messageData["body"] == obj2e.body
|
||||||
|
obj3e = MsgDecode(3, obj3.data)
|
||||||
|
assert messageData["subject"] == obj3e.subject
|
||||||
|
assert messageData["body"] == obj3e.body
|
||||||
|
|
|
@ -1,7 +1,13 @@
|
||||||
from importlib import import_module
|
from importlib import import_module
|
||||||
from pprint import pprint
|
|
||||||
from os import path, listdir
|
from os import path, listdir
|
||||||
import sys
|
from string import lower
|
||||||
|
|
||||||
|
from debug import logger
|
||||||
|
|
||||||
|
|
||||||
|
class MsgBase(object):
|
||||||
|
def encode(self):
|
||||||
|
self.data = {"": lower(type(self).__name__)}
|
||||||
|
|
||||||
|
|
||||||
def constructObject(data):
|
def constructObject(data):
|
||||||
|
@ -11,13 +17,13 @@ def constructObject(data):
|
||||||
print "Don't know how to handle message type: \"%s\"" % (data[""])
|
print "Don't know how to handle message type: \"%s\"" % (data[""])
|
||||||
return None
|
return None
|
||||||
try:
|
try:
|
||||||
returnObj = classBase(data)
|
returnObj = classBase()
|
||||||
|
returnObj.decode(data)
|
||||||
except KeyError as e:
|
except KeyError as e:
|
||||||
print "Missing mandatory key %s" % (e)
|
logger.error("Missing mandatory key %s", e)
|
||||||
return None
|
return None
|
||||||
except:
|
except:
|
||||||
print "classBase fail:"
|
logger.error("classBase fail", exc_info=True)
|
||||||
pprint(sys.exc_info())
|
|
||||||
return None
|
return None
|
||||||
else:
|
else:
|
||||||
return returnObj
|
return returnObj
|
||||||
|
@ -31,7 +37,6 @@ for mod in listdir(path.dirname(__file__)):
|
||||||
try:
|
try:
|
||||||
import_module("." + splitted[0], "messagetypes")
|
import_module("." + splitted[0], "messagetypes")
|
||||||
except ImportError:
|
except ImportError:
|
||||||
print "Error importing %s" % (mod)
|
logger.error("Error importing %s", mod, exc_info=True)
|
||||||
pprint(sys.exc_info())
|
|
||||||
else:
|
else:
|
||||||
print "Imported %s" % (mod)
|
logger.debug("Imported message type module %s", mod)
|
||||||
|
|
|
@ -1,8 +1,23 @@
|
||||||
class Message:
|
from debug import logger
|
||||||
def __init__(self, data):
|
from messagetypes import MsgBase
|
||||||
|
|
||||||
|
class Message(MsgBase):
|
||||||
|
def __init__(self):
|
||||||
|
return
|
||||||
|
|
||||||
|
def decode(self, data):
|
||||||
self.subject = data["subject"]
|
self.subject = data["subject"]
|
||||||
self.body = data["body"]
|
self.body = data["body"]
|
||||||
|
|
||||||
|
def encode(self, data):
|
||||||
|
super(Message, self).encode()
|
||||||
|
try:
|
||||||
|
self.data["subject"] = data["subject"]
|
||||||
|
self.data["body"] = data["body"]
|
||||||
|
except KeyError as e:
|
||||||
|
logger.error("Missing key ", e.name)
|
||||||
|
return self.data
|
||||||
|
|
||||||
def process(self):
|
def process(self):
|
||||||
print "Subject: %s" % (self.subject)
|
logger.debug("Subject: %i bytes", len(self.subject))
|
||||||
print "Body: %s" % (self.body)
|
logger.debug("Body: %i bytes", len(self.body))
|
||||||
|
|
|
@ -1,8 +1,23 @@
|
||||||
class Vote:
|
from debug import logger
|
||||||
def __init__(self, data):
|
from messagetypes import MsgBase
|
||||||
|
|
||||||
|
class Vote(MsgBase):
|
||||||
|
def __init__(self):
|
||||||
|
return
|
||||||
|
|
||||||
|
def decode(self, data):
|
||||||
self.msgid = data["msgid"]
|
self.msgid = data["msgid"]
|
||||||
self.vote = data["vote"]
|
self.vote = data["vote"]
|
||||||
|
|
||||||
|
def encode(self, data):
|
||||||
|
super(Vote, self).encode()
|
||||||
|
try:
|
||||||
|
self.data["msgid"] = data["msgid"]
|
||||||
|
self.data["vote"] = data["vote"]
|
||||||
|
except KeyError as e:
|
||||||
|
logger.error("Missing key ", e.name)
|
||||||
|
return self.data
|
||||||
|
|
||||||
def process(self):
|
def process(self):
|
||||||
print "msgid: %s" % (self.msgid)
|
logger.debug("msgid: %s", self.msgid)
|
||||||
print "vote: %s" % (self.vote)
|
logger.debug("vote: %s", self.vote)
|
||||||
|
|
Reference in New Issue
Block a user