Beispiel #1
0
	def dataReceived(self, data):
		self._bufer = self._bufer + data
		#[uint32_t playerid][uint16_t msg_channel][uint16_t cmd][string amf3_data]

		LOG.info('len data: %s' % (len(data)))
		while(len(self._bufer) >= 12):
			(playerid, msg_channel, cmd, amf3_data_len) = struct.unpack("!IHHI", self._bufer[0:12])
			LOG.info("playerid: %s, msg_channel: %s, cmd: %s, amf3_data_len:\
				%s" % (playerid, msg_channel, pattern.to_hex(cmd), amf3_data_len,))
			amf3_data_fmt = '!%ss' % (amf3_data_len)
			if (len(self._bufer[12:]) >= amf3_data_len):
				rqstid = uuid.uuid1()
				self._rqstid[rqstid] = {'rqstid':rqstid,
										'msg_channel':msg_channel,
										'playerid':playerid,
										'cmd':cmd}
				(amf3_data,) = struct.unpack(amf3_data_fmt, self._bufer[12:12+amf3_data_len])
				LOG.info("amf3_data: %s" % repr(amf3_data))
				self._bufer = self._bufer[12+amf3_data_len:]
				decoder = Decoder(amf3=True)
				data = decoder.decode(amf3_data)
				LOG.info("data: %s" % (data))
				try:
					callback = self._callback[cmd]
					callback(self, playerid, rqstid, data) 
				except KeyError:
					LOG.ERROR("CMD error, The CMD: %s can not be handled" %
					(pattern.to_hex(cmd)))
					break
Beispiel #2
0
    def test_get_element_custom_mimetype_amf(self):
        
        doc_id = self.insert_docs(self.test_db, self.test_collection, self.insert_data)
        
        item_id = str(doc_id[0])
        
        test_get_element_url = self.base_url + (self.get_item_path % (self.test_db, self.test_collection, item_id))
        response_obj = GET(test_get_element_url, async = False, accept = [self.test_amf_mimetype] , resp = True, credentials = [self.test_user, self.test_password,""])

        return_value, http_status = self.get_http_response(response_obj)

        self.assertEquals(type(return_value).__name__, "str")

        decoder = Decoder(amf3=True)
        doc_obj = decoder.decode(return_value)[settings.DOC_CONTAINER]
        

        self.assertTrue(u'_id' in doc_obj)
        
        del doc_obj[u'_id']
        
        self.assertTrue(check_dictionaries_match(doc_obj, self.test_doc))
Beispiel #3
0
def decoderAmf3Data(amf3_data):
	decoder = Decoder(amf3=True)
	data = decoder.decode(amf3_data)
	return data
Beispiel #4
0
class Amf0DecoderTestCase(unittest.TestCase):
    class Spam(object):
        def __init__(self):
            self.spam = 'eggs'

    def setUp(self):
        self.class_mapper = class_def.ClassDefMapper()
        self.decoder = Decoder()

    def testFalse(self):
        self.assertEquals(False, decode.decode(DecoderContext('\x01\x00')))

    def testStringInput(self):
        self.assertEquals(False, decode.decode('\x01\x00'))

    def testDecoderObj(self):
        self.assertEquals(False, decode.decode('\x01\x00'))

    def testTrue(self):
        self.assertEquals(True, self.decoder.decode('\x01\x01'))

    def testNumber(self):
        tests = {
            0: '\x00\x00\x00\x00\x00\x00\x00\x00\x00',
            0.2: '\x00\x3f\xc9\x99\x99\x99\x99\x99\x9a',
            1: '\x00\x3f\xf0\x00\x00\x00\x00\x00\x00',
            42: '\x00\x40\x45\x00\x00\x00\x00\x00\x00',
            -123: '\x00\xc0\x5e\xc0\x00\x00\x00\x00\x00',
            1.23456789: '\x00\x3f\xf3\xc0\xca\x42\x83\xde\x1b'
        }

        for number, encoding in tests.iteritems():
            self.assertEquals(number, decode.decode(DecoderContext(encoding)))

    def testString(self):
        tests = {'': '\x02\x00\x00', 'hello': '\x02\x00\x05hello'}

        for string, encoding in tests.iteritems():
            self.assertEquals(string, decode.decode(DecoderContext(encoding)))

    def testLongString(self):
        decoded = 's' * 65537
        encoded = '\x0C\x00\x01\x00\x01' + decoded

        self.assertEquals(decoded, decode.decode(DecoderContext(encoded)))

    def testNull(self):
        self.assertEquals(None, decode.decode(DecoderContext('\x05')))

    def testUndefined(self):
        self.assertEquals(None, decode.decode(DecoderContext('\x06')))

    def testAnonObj(self):
        encoded = '\x03'  #header
        encoded += '\x00\x04spam\x02\x00\x04eggs'  #values
        encoded += '\x00\x00\t'  # terminator
        result = decode.decode(DecoderContext(encoded))
        self.assertEquals('eggs', result['spam'])

        result = decode.decode(DecoderContext(StringIO(encoded)))
        self.assertEquals('eggs', result['spam'])

    def testMixedArray(self):
        encoded = '\x08\x00\x00\x00\x00'  # mixed array header
        encoded += '\x00\x04spam\x02\x00\x04eggs'  #values
        encoded += '\x00\x00\t'  # terminator

        result = decode.decode(DecoderContext(encoded))
        self.assertEquals('eggs', result['spam'])

        result = decode.decode(DecoderContext(StringIO(encoded)))
        self.assertEquals('eggs', result['spam'])

    def testArray(self):
        decoded = [0, 1, 1.23456789]
        encoded = '\x0A\x00\x00\x00\x03'  # 3 element array header
        encoded += '\x00\x00\x00\x00\x00\x00\x00\x00\x00'  # element 1
        encoded += '\x00\x3f\xf0\x00\x00\x00\x00\x00\x00'  #element 2
        encoded += '\x00\x3f\xf3\xc0\xca\x42\x83\xde\x1b'  #element 3

        result = decode.decode(DecoderContext(encoded))
        for i, obj in enumerate(decoded):
            self.assertEquals(obj, result[i])

        result = decode.decode(DecoderContext(StringIO(encoded)))
        for i, obj in enumerate(decoded):
            self.assertEquals(obj, result[i])

    def testDate(self):
        import datetime
        encoded = '\x0BBp+6!\x15\x80\x00\x00\x00'
        result = decode.decode(DecoderContext(encoded))
        self.assertEquals(2005, result.year)
        self.assertEquals(3, result.month)
        self.assertEquals(18, result.day)
        self.assertEquals(1, result.hour)
        self.assertEquals(58, result.minute)
        self.assertEquals(31, result.second)

    def testXml(self):
        import xml.dom.minidom

        encoded = '\x0F'  # XML header
        encoded += '\x00\x00\x00\x55'  # String header
        encoded += '<?xml version="1.0" ?><test>\n            <test_me>tester</test_me>\n           </test>'  # encoded XML

        result = decode.decode(DecoderContext(encoded))
        self.assertEquals(xml.dom.minidom.Document, result.__class__)

    def testDynamicObj(self):
        self.class_mapper.mapClass(
            class_def.DynamicClassDef(self.Spam, 'alias.spam', ()))

        encoded = '\x10\x00\x0Aalias.spam'
        encoded += '\x00\x04spam\x02\x00\x04eggs\x00\x00\x09'  # dynamic attrs

        result = decode.decode(
            DecoderContext(encoded, class_def_mapper=self.class_mapper))
        self.class_mapper.unmapClass(self.Spam)

        self.assertEquals('eggs', result.spam)

    def testStaticObj(self):
        self.class_mapper.mapClass(
            class_def=class_def.ClassDef(self.Spam, 'alias.spam', ('spam')))

        encoded = '\x10\x00\x0Aalias.spam'
        encoded += '\x00\x04spam\x02\x00\x04eggs\x00\x00\x09'  # dynamic attrs

        result = decode.decode(
            DecoderContext(encoded, class_def_mapper=self.class_mapper))
        self.class_mapper.unmapClass(self.Spam)

        self.assertEquals('eggs', result.spam)

    def testReferences(self):
        encoded = '\x0A\x00\x00\x00\x04'  # 3 element array header
        encoded += '\x03\x00\x04spam\x02\x00\x04eggs\x00\x00\t'  # obj 1
        encoded += '\x07\x00\x01'  # ref to obj 1
        encoded += '\x07\x00\x01'  # ref to obj 1
        encoded += '\x07\x00\x00'  # circular ref
        result = decode.decode(DecoderContext(encoded))

        self.assertEquals(4, len(result))
        self.assertEquals(result, result.pop(-1))
        for obj in result:
            self.assertEquals('eggs', obj['spam'])

    def testUnkownByteRaisesException(self):
        self.assertRaises(decode.DecodeError, decode.decode,
                          DecoderContext('\xFF'))
class Amf0DecoderTestCase(unittest.TestCase):
    class Spam(object):
        def __init__(self):
            self.spam = 'eggs'

    def setUp(self):
        self.class_mapper = class_def.ClassDefMapper()
        self.decoder = Decoder()

    def testFalse(self):
        self.assertEquals(False, decode.decode(DecoderContext('\x01\x00')))

    def testStringInput(self):
        self.assertEquals(False, decode.decode('\x01\x00'))

    def testDecoderObj(self):
        self.assertEquals(False, decode.decode('\x01\x00'))

    def testTrue(self):
        self.assertEquals(True, self.decoder.decode('\x01\x01'))

    def testNumber(self):
        tests = {
            0: '\x00\x00\x00\x00\x00\x00\x00\x00\x00',
            0.2: '\x00\x3f\xc9\x99\x99\x99\x99\x99\x9a',
            1: '\x00\x3f\xf0\x00\x00\x00\x00\x00\x00',
            42: '\x00\x40\x45\x00\x00\x00\x00\x00\x00',
            -123: '\x00\xc0\x5e\xc0\x00\x00\x00\x00\x00',
            1.23456789: '\x00\x3f\xf3\xc0\xca\x42\x83\xde\x1b'
        }

        for number, encoding in tests.iteritems():
            self.assertEquals(number, decode.decode(DecoderContext(encoding)))

    def testString(self):
        tests = {
            '': '\x02\x00\x00',
            'hello': '\x02\x00\x05hello'
        }

        for string, encoding in tests.iteritems():
            self.assertEquals(string, decode.decode(DecoderContext(encoding)))

    def testLongString(self):
        decoded = 's' * 65537
        encoded = '\x0C\x00\x01\x00\x01' + decoded
  
        self.assertEquals(decoded, decode.decode(DecoderContext(encoded)))

    def testNull(self):
        self.assertEquals(None, decode.decode(DecoderContext('\x05')))

    def testUndefined(self):
        self.assertEquals(None, decode.decode(DecoderContext('\x06')))

    def testAnonObj(self):
        encoded = '\x03' #header
        encoded += '\x00\x04spam\x02\x00\x04eggs' #values
        encoded += '\x00\x00\t' # terminator
        result = decode.decode(DecoderContext(encoded))
        self.assertEquals('eggs', result['spam'])

        result = decode.decode(DecoderContext(StringIO(encoded)))
        self.assertEquals('eggs', result['spam'])

    def testMixedArray(self):
        encoded = '\x08\x00\x00\x00\x00' # mixed array header
        encoded += '\x00\x04spam\x02\x00\x04eggs' #values
        encoded += '\x00\x00\t' # terminator

        result = decode.decode(DecoderContext(encoded))
        self.assertEquals('eggs', result['spam'])

        result = decode.decode(DecoderContext(StringIO(encoded)))
        self.assertEquals('eggs', result['spam'])

    def testArray(self):
        decoded = [0, 1, 1.23456789]
        encoded = '\x0A\x00\x00\x00\x03' # 3 element array header
        encoded += '\x00\x00\x00\x00\x00\x00\x00\x00\x00' # element 1
        encoded += '\x00\x3f\xf0\x00\x00\x00\x00\x00\x00' #element 2
        encoded += '\x00\x3f\xf3\xc0\xca\x42\x83\xde\x1b' #element 3

        result = decode.decode(DecoderContext(encoded))
        for i, obj in enumerate(decoded):
            self.assertEquals(obj, result[i])

        result = decode.decode(DecoderContext(StringIO(encoded)))
        for i, obj in enumerate(decoded):
            self.assertEquals(obj, result[i])

    def testDate(self):
        import datetime
        encoded = '\x0BBp+6!\x15\x80\x00\x00\x00'
        result = decode.decode(DecoderContext(encoded))
        self.assertEquals(2005, result.year)
        self.assertEquals(3, result.month)
        self.assertEquals(18, result.day)
        self.assertEquals(1, result.hour)
        self.assertEquals(58, result.minute)
        self.assertEquals(31, result.second)

    def testXml(self):
        import xml.dom.minidom

        encoded = '\x0F' # XML header
        encoded += '\x00\x00\x00\x55' # String header
        encoded += '<?xml version="1.0" ?><test>\n            <test_me>tester</test_me>\n           </test>' # encoded XML

        result = decode.decode(DecoderContext(encoded))
        self.assertEquals(xml.dom.minidom.Document, result.__class__)

    def testDynamicObj(self):
        self.class_mapper.mapClass(class_def.DynamicClassDef(self.Spam, 'alias.spam', ()))

        encoded = '\x10\x00\x0Aalias.spam'
        encoded += '\x00\x04spam\x02\x00\x04eggs\x00\x00\x09' # dynamic attrs

        result = decode.decode(DecoderContext(encoded, class_def_mapper=self.class_mapper))
        self.class_mapper.unmapClass(self.Spam)

        self.assertEquals('eggs', result.spam)

    def testStaticObj(self):
        self.class_mapper.mapClass(class_def = class_def.ClassDef(self.Spam, 'alias.spam', ('spam')))

        encoded = '\x10\x00\x0Aalias.spam'
        encoded += '\x00\x04spam\x02\x00\x04eggs\x00\x00\x09' # dynamic attrs

        result = decode.decode(DecoderContext(encoded, class_def_mapper=self.class_mapper))
        self.class_mapper.unmapClass(self.Spam)

        self.assertEquals('eggs', result.spam)

    def testReferences(self):
        encoded = '\x0A\x00\x00\x00\x04' # 3 element array header
        encoded += '\x03\x00\x04spam\x02\x00\x04eggs\x00\x00\t' # obj 1
        encoded += '\x07\x00\x01' # ref to obj 1
        encoded += '\x07\x00\x01' # ref to obj 1
        encoded += '\x07\x00\x00' # circular ref
        result = decode.decode(DecoderContext(encoded))

        self.assertEquals(4, len(result))
        self.assertEquals(result, result.pop(-1))
        for obj in result:
            self.assertEquals('eggs', obj['spam'])

    def testUnkownByteRaisesException(self):
        self.assertRaises(decode.DecodeError, decode.decode, DecoderContext('\xFF'))