kopia lustrzana https://github.com/Yakifo/amqtt
				
				
				
			Add header encoding
							rodzic
							
								
									05dc5bd97e
								
							
						
					
					
						commit
						76bacc445e
					
				|  | @ -6,6 +6,7 @@ import asyncio | ||||||
| from hbmqtt.codecs.utils import ( | from hbmqtt.codecs.utils import ( | ||||||
|     bytes_to_hex_str, |     bytes_to_hex_str, | ||||||
|     bytes_to_int, |     bytes_to_int, | ||||||
|  |     int_to_bytes, | ||||||
|     read_or_raise, |     read_or_raise, | ||||||
| ) | ) | ||||||
| from hbmqtt.message import MQTTHeader, MessageType | from hbmqtt.message import MQTTHeader, MessageType | ||||||
|  | @ -24,11 +25,11 @@ class MQTTHeaderCodec: | ||||||
|         :param reader: Stream to read |         :param reader: Stream to read | ||||||
|         :return: FixedHeader instance |         :return: FixedHeader instance | ||||||
|         """ |         """ | ||||||
|         def get_message_type(byte): |         def decode_message_type(byte): | ||||||
|             byte_type = (bytes_to_int(byte) & 0xf0) >> 4 |             byte_type = (bytes_to_int(byte) & 0xf0) >> 4 | ||||||
|             return MessageType(byte_type) |             return MessageType(byte_type) | ||||||
| 
 | 
 | ||||||
|         def get_flags(data): |         def decode_flags(data): | ||||||
|             byte = bytes_to_int(data) |             byte = bytes_to_int(data) | ||||||
|             return byte & 0x0f |             return byte & 0x0f | ||||||
| 
 | 
 | ||||||
|  | @ -55,10 +56,10 @@ class MQTTHeaderCodec: | ||||||
|             return value |             return value | ||||||
| 
 | 
 | ||||||
|         b1 = yield from read_or_raise(reader, 1) |         b1 = yield from read_or_raise(reader, 1) | ||||||
|         msg_type = get_message_type(b1) |         msg_type = decode_message_type(b1) | ||||||
|         if msg_type is MessageType.RESERVED_0 or msg_type is MessageType.RESERVED_15: |         if msg_type is MessageType.RESERVED_0 or msg_type is MessageType.RESERVED_15: | ||||||
|             raise MQTTHeaderException("Usage of control packet type %s is forbidden" % msg_type) |             raise MQTTHeaderException("Usage of control packet type %s is forbidden" % msg_type) | ||||||
|         flags = get_flags(b1) |         flags = decode_flags(b1) | ||||||
| 
 | 
 | ||||||
|         remain_length = yield from decode_remaining_length() |         remain_length = yield from decode_remaining_length() | ||||||
|         return MQTTHeader(msg_type, flags, remain_length) |         return MQTTHeader(msg_type, flags, remain_length) | ||||||
|  | @ -66,5 +67,28 @@ class MQTTHeaderCodec: | ||||||
|     @staticmethod |     @staticmethod | ||||||
|     @asyncio.coroutine |     @asyncio.coroutine | ||||||
|     def encode(header: MQTTHeader, writer): |     def encode(header: MQTTHeader, writer): | ||||||
|         # To be done |         def encode_remaining_length(length:int): | ||||||
|         pass |             encoded = b'' | ||||||
|  |             while True: | ||||||
|  |                 length_byte = length % 0x80 | ||||||
|  |                 length /= 0x80 | ||||||
|  |                 if length > 0: | ||||||
|  |                     length_byte |= 0x80 | ||||||
|  |                 encoded += int_to_bytes(length_byte, 1) | ||||||
|  |                 if length <= 0: | ||||||
|  |                     break | ||||||
|  |             return encoded | ||||||
|  | 
 | ||||||
|  |         packet_type = 0 | ||||||
|  |         try: | ||||||
|  |             packet_type = (header.message_type.value << 4) & header.flags | ||||||
|  |             encoded_type = int_to_bytes(packet_type, 1) | ||||||
|  |             writer.write(encoded_type) | ||||||
|  |         except OverflowError: | ||||||
|  |             raise CodecException('packet_size encoding exceed 1 byte length: value=%d', packet_type) | ||||||
|  | 
 | ||||||
|  |         try: | ||||||
|  |             encoded_length = encode_remaining_length(header.remaining_length) | ||||||
|  |             writer.write(encoded_length) | ||||||
|  |         except OverflowError: | ||||||
|  |             raise CodecException('message length encoding exceed 1 byte length: value=%d', header.remaining_length) | ||||||
|  |  | ||||||
		Ładowanie…
	
		Reference in New Issue
	
	 Nicolas Jouanin
						Nicolas Jouanin