From e1d86973312075ae3a5d79a70759908f36dfd350 Mon Sep 17 00:00:00 2001 From: Christian Date: Tue, 13 Mar 2018 20:22:48 +0100 Subject: [PATCH] Fix wrong parsing and generating of MqttConnAck for version 3.1.0 --- .../Serializer/MqttPacketSerializer.cs | 35 ++++++++++++------- .../MqttPacketSerializerTests.cs | 19 +++++++--- 2 files changed, 37 insertions(+), 17 deletions(-) diff --git a/Frameworks/MQTTnet.NetStandard/Serializer/MqttPacketSerializer.cs b/Frameworks/MQTTnet.NetStandard/Serializer/MqttPacketSerializer.cs index 6491e281..63a3c646 100644 --- a/Frameworks/MQTTnet.NetStandard/Serializer/MqttPacketSerializer.cs +++ b/Frameworks/MQTTnet.NetStandard/Serializer/MqttPacketSerializer.cs @@ -75,7 +75,7 @@ namespace MQTTnet.Serializer } } - private static MqttBasePacket Deserialize(MqttPacketHeader header, MqttPacketReader reader) + private MqttBasePacket Deserialize(MqttPacketHeader header, MqttPacketReader reader) { switch (header.ControlPacketType) { @@ -278,20 +278,22 @@ namespace MQTTnet.Serializer return packet; } - private static MqttBasePacket DeserializeConnAck(MqttPacketReader reader) + private MqttBasePacket DeserializeConnAck(MqttPacketReader reader) { - var variableHeader1 = reader.ReadByte(); - var variableHeader2 = reader.ReadByte(); + var packet = new MqttConnAckPacket(); - var packet = new MqttConnAckPacket + var firstByteReader = new ByteReader(reader.ReadByte()); + + if (ProtocolVersion == MqttProtocolVersion.V311) { - IsSessionPresent = new ByteReader(variableHeader1).Read(), - ConnectReturnCode = (MqttConnectReturnCode)variableHeader2 - }; + packet.IsSessionPresent = firstByteReader.Read(); + } + + packet.ConnectReturnCode = (MqttConnectReturnCode)reader.ReadByte(); return packet; } - + private static void ValidateConnectPacket(MqttConnectPacket packet) { if (packet == null) throw new ArgumentNullException(nameof(packet)); @@ -373,14 +375,21 @@ namespace MQTTnet.Serializer private byte Serialize(MqttConnAckPacket packet, MqttPacketWriter writer) { - var connectAcknowledgeFlags = new ByteWriter(); - - if (ProtocolVersion == MqttProtocolVersion.V311) + if (ProtocolVersion == MqttProtocolVersion.V310) { + writer.Write(0); + } + else if (ProtocolVersion == MqttProtocolVersion.V311) + { + var connectAcknowledgeFlags = new ByteWriter(); connectAcknowledgeFlags.Write(packet.IsSessionPresent); + writer.Write(connectAcknowledgeFlags); + } + else + { + throw new MqttProtocolViolationException("Protocol version not supported."); } - writer.Write(connectAcknowledgeFlags); writer.Write((byte)packet.ConnectReturnCode); return MqttPacketWriter.BuildFixedHeader(MqttControlPacketType.ConnAck); diff --git a/Tests/MQTTnet.Core.Tests/MqttPacketSerializerTests.cs b/Tests/MQTTnet.Core.Tests/MqttPacketSerializerTests.cs index 072e1a93..1111d907 100644 --- a/Tests/MQTTnet.Core.Tests/MqttPacketSerializerTests.cs +++ b/Tests/MQTTnet.Core.Tests/MqttPacketSerializerTests.cs @@ -119,10 +119,10 @@ namespace MQTTnet.Core.Tests { var p = new MqttConnAckPacket { - ConnectReturnCode = MqttConnectReturnCode.ConnectionAccepted + ConnectReturnCode = MqttConnectReturnCode.ConnectionRefusedNotAuthorized }; - SerializeAndCompare(p, "IAIAAA==", MqttProtocolVersion.V310); + SerializeAndCompare(p, "IAIABQ==", MqttProtocolVersion.V310); } [TestMethod] @@ -137,6 +137,17 @@ namespace MQTTnet.Core.Tests DeserializeAndCompare(p, "IAIBBQ=="); } + [TestMethod] + public void DeserializeV310_MqttConnAckPacket() + { + var p = new MqttConnAckPacket + { + ConnectReturnCode = MqttConnectReturnCode.ConnectionRefusedNotAuthorized + }; + + DeserializeAndCompare(p, "IAIABQ==", MqttProtocolVersion.V310); + } + [TestMethod] public void SerializeV311_MqttDisconnectPacket() { @@ -397,9 +408,9 @@ namespace MQTTnet.Core.Tests Assert.AreEqual(expectedBase64Value, Convert.ToBase64String(Join(chunks))); } - private static void DeserializeAndCompare(MqttBasePacket packet, string expectedBase64Value) + private static void DeserializeAndCompare(MqttBasePacket packet, string expectedBase64Value, MqttProtocolVersion protocolVersion = MqttProtocolVersion.V311) { - var serializer = new MqttPacketSerializer(); + var serializer = new MqttPacketSerializer { ProtocolVersion = protocolVersion }; var buffer1 = serializer.Serialize(packet);