Check CONNECT is the first message received and that it is received only once

pull/8/head
Nicolas Jouanin 2015-05-31 21:38:49 +02:00
rodzic c8b3f5bfac
commit b1444f6a03
1 zmienionych plików z 12 dodań i 4 usunięć

Wyświetl plik

@ -10,6 +10,7 @@ from hbmqtt.codecs.header import MQTTHeaderCodec
from hbmqtt.codecs.errors import CodecException from hbmqtt.codecs.errors import CodecException
from hbmqtt.codecs.connect import ConnectMessage from hbmqtt.codecs.connect import ConnectMessage
from hbmqtt.message import MessageType from hbmqtt.message import MessageType
from hbmqtt.errors import MQTTException
class BrokerProtocol(asyncio.Protocol): class BrokerProtocol(asyncio.Protocol):
@ -100,13 +101,20 @@ def init_message_codecs():
def client_connected(reader, writer): def client_connected(reader, writer):
(remote_address, remote_port) = writer.get_extra_info('peername') (remote_address, remote_port) = writer.get_extra_info('peername')
codecs = init_message_codecs() codecs = init_message_codecs()
first_packet = True
while True: while True:
try: try:
# Read fixed header # Read fixed header
fixed_header = yield from MQTTHeaderCodec.decode(reader) header = yield from MQTTHeaderCodec.decode(reader)
if first_packet and header.message_type != MessageType.CONNECT:
raise MQTTException("[MQTT-3.1.0-1] First Packet sent from the Client MUST be a CONNECT Packet")
if not first_packet and header.message_type == MessageType.CONNECT:
raise MQTTException("[MQTT-3.1.0-2] Client can only send the CONNECT Packet once over a Network Connection")
first_packet = False
# Find message decoder and decode # Find message decoder and decode
codec = codecs[fixed_header.message_type] codec = codecs[header.message_type]
message = yield from codec.decode(fixed_header, reader) message = yield from codec.decode(header, reader)
except CodecException:
except MQTTException:
#End connection #End connection
break break