def from_stream(cls, reader: ReaderAdapter, fixed_header: MQTTFixedHeader, variable_header: ConnectVariableHeader): payload = cls() # Client identifier try: payload.client_id = yield from decode_string(reader) except NoDataException: payload.client_id = None # Read will topic, username and password if variable_header.will_flag: try: payload.will_topic = yield from decode_string(reader) payload.will_message = yield from decode_data_with_length( reader) except NoDataException: payload.will_topic = None payload.will_message = None if variable_header.username_flag: try: payload.username = yield from decode_string(reader) except NoDataException: payload.username = None if variable_header.password_flag: try: payload.password = yield from decode_string(reader) except NoDataException: payload.password = None return payload
def from_stream(cls, reader: asyncio.StreamReader, fixed_header: MQTTFixedHeader): topic_name = yield from decode_string(reader) has_qos = (fixed_header.flags >> 1) & 0x03 if has_qos: packet_id = yield from decode_packet_id(reader) else: packet_id = None return cls(topic_name, packet_id)
def from_stream(cls, reader: asyncio.StreamReader, fixed_header: MQTTFixedHeader, variable_header: MQTTVariableHeader): topics = [] payload_length = fixed_header.remaining_length - variable_header.bytes_length read_bytes = 0 while read_bytes < payload_length: try: topic = yield from decode_string(reader) topics.append(topic) read_bytes += 2 + len(topic.encode('utf-8')) except NoDataException: break return cls(topics)
def from_stream(cls, reader: ReaderAdapter, fixed_header: MQTTFixedHeader, variable_header: ConnectVariableHeader): payload = cls() # Client identifier try: payload.client_id = yield from decode_string(reader) except NoDataException: payload.client_id = None if (payload.client_id is None or payload.client_id == ""): # A Server MAY allow a Client to supply a ClientId that has a length of zero bytes # [MQTT-3.1.3-6] payload.client_id = gen_client_id() # indicator to trow exception in case CLEAN_SESSION_FLAG is set to False payload.client_id_is_random = True # Read will topic, username and password if variable_header.will_flag: try: payload.will_topic = yield from decode_string(reader) payload.will_message = yield from decode_data_with_length( reader) except NoDataException: payload.will_topic = None payload.will_message = None if variable_header.username_flag: try: payload.username = yield from decode_string(reader) except NoDataException: payload.username = None if variable_header.password_flag: try: payload.password = yield from decode_string(reader) except NoDataException: payload.password = None return payload
def from_stream(cls, reader: ReaderAdapter, fixed_header: MQTTFixedHeader, variable_header: ConnectVariableHeader): payload = cls() # Client identifier try: payload.client_id = yield from decode_string(reader) except NoDataException: payload.client_id = None if (payload.client_id is None or payload.client_id == ""): # A Server MAY allow a Client to supply a ClientId that has a length of zero bytes # [MQTT-3.1.3-6] payload.client_id = gen_client_id() # indicator to trow exception in case CLEAN_SESSION_FLAG is set to False payload.client_id_is_random = True # Read will topic, username and password if variable_header.will_flag: try: payload.will_topic = yield from decode_string(reader) payload.will_message = yield from decode_data_with_length(reader) except NoDataException: payload.will_topic = None payload.will_message = None if variable_header.username_flag: try: payload.username = yield from decode_string(reader) except NoDataException: payload.username = None if variable_header.password_flag: try: payload.password = yield from decode_string(reader) except NoDataException: payload.password = None return payload
def from_stream(cls, reader: asyncio.StreamReader, fixed_header: MQTTFixedHeader, variable_header: MQTTVariableHeader): topics = [] payload_length = fixed_header.remaining_length - variable_header.bytes_length read_bytes = 0 while read_bytes < payload_length: try: topic = yield from decode_string(reader) qos_byte = yield from read_or_raise(reader, 1) qos = bytes_to_int(qos_byte) topics.append((topic, qos)) read_bytes += 2 + len(topic.encode('utf-8')) + 1 except NoDataException as exc: break return cls(topics)
def from_stream(cls, reader: ReaderAdapter, fixed_header: MQTTFixedHeader): # protocol name protocol_name = yield from decode_string(reader) # protocol level protocol_level_byte = yield from read_or_raise(reader, 1) protocol_level = bytes_to_int(protocol_level_byte) # flags flags_byte = yield from read_or_raise(reader, 1) flags = bytes_to_int(flags_byte) # keep-alive keep_alive_byte = yield from read_or_raise(reader, 2) keep_alive = bytes_to_int(keep_alive_byte) return cls(flags, keep_alive, protocol_name, protocol_level)
def test_decode_string(self): stream = asyncio.StreamReader(loop=self.loop) stream.feed_data(b'\x00\x02AA') ret = self.loop.run_until_complete(decode_string(stream)) self.assertEqual(ret, 'AA')