Fix wrong parsing and generating of MqttConnAck for version 3.1.0

This commit is contained in:
Christian
2018-03-13 20:22:48 +01:00
parent 90098c2006
commit e1d8697331
2 changed files with 37 additions and 17 deletions
@@ -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) switch (header.ControlPacketType)
{ {
@@ -278,20 +278,22 @@ namespace MQTTnet.Serializer
return packet; return packet;
} }
private static MqttBasePacket DeserializeConnAck(MqttPacketReader reader) private MqttBasePacket DeserializeConnAck(MqttPacketReader reader)
{ {
var variableHeader1 = reader.ReadByte(); var packet = new MqttConnAckPacket();
var variableHeader2 = reader.ReadByte();
var packet = new MqttConnAckPacket var firstByteReader = new ByteReader(reader.ReadByte());
if (ProtocolVersion == MqttProtocolVersion.V311)
{ {
IsSessionPresent = new ByteReader(variableHeader1).Read(), packet.IsSessionPresent = firstByteReader.Read();
ConnectReturnCode = (MqttConnectReturnCode)variableHeader2 }
};
packet.ConnectReturnCode = (MqttConnectReturnCode)reader.ReadByte();
return packet; return packet;
} }
private static void ValidateConnectPacket(MqttConnectPacket packet) private static void ValidateConnectPacket(MqttConnectPacket packet)
{ {
if (packet == null) throw new ArgumentNullException(nameof(packet)); if (packet == null) throw new ArgumentNullException(nameof(packet));
@@ -373,14 +375,21 @@ namespace MQTTnet.Serializer
private byte Serialize(MqttConnAckPacket packet, MqttPacketWriter writer) private byte Serialize(MqttConnAckPacket packet, MqttPacketWriter writer)
{ {
var connectAcknowledgeFlags = new ByteWriter(); if (ProtocolVersion == MqttProtocolVersion.V310)
if (ProtocolVersion == MqttProtocolVersion.V311)
{ {
writer.Write(0);
}
else if (ProtocolVersion == MqttProtocolVersion.V311)
{
var connectAcknowledgeFlags = new ByteWriter();
connectAcknowledgeFlags.Write(packet.IsSessionPresent); connectAcknowledgeFlags.Write(packet.IsSessionPresent);
writer.Write(connectAcknowledgeFlags);
}
else
{
throw new MqttProtocolViolationException("Protocol version not supported.");
} }
writer.Write(connectAcknowledgeFlags);
writer.Write((byte)packet.ConnectReturnCode); writer.Write((byte)packet.ConnectReturnCode);
return MqttPacketWriter.BuildFixedHeader(MqttControlPacketType.ConnAck); return MqttPacketWriter.BuildFixedHeader(MqttControlPacketType.ConnAck);
@@ -119,10 +119,10 @@ namespace MQTTnet.Core.Tests
{ {
var p = new MqttConnAckPacket var p = new MqttConnAckPacket
{ {
ConnectReturnCode = MqttConnectReturnCode.ConnectionAccepted ConnectReturnCode = MqttConnectReturnCode.ConnectionRefusedNotAuthorized
}; };
SerializeAndCompare(p, "IAIAAA==", MqttProtocolVersion.V310); SerializeAndCompare(p, "IAIABQ==", MqttProtocolVersion.V310);
} }
[TestMethod] [TestMethod]
@@ -137,6 +137,17 @@ namespace MQTTnet.Core.Tests
DeserializeAndCompare(p, "IAIBBQ=="); DeserializeAndCompare(p, "IAIBBQ==");
} }
[TestMethod]
public void DeserializeV310_MqttConnAckPacket()
{
var p = new MqttConnAckPacket
{
ConnectReturnCode = MqttConnectReturnCode.ConnectionRefusedNotAuthorized
};
DeserializeAndCompare(p, "IAIABQ==", MqttProtocolVersion.V310);
}
[TestMethod] [TestMethod]
public void SerializeV311_MqttDisconnectPacket() public void SerializeV311_MqttDisconnectPacket()
{ {
@@ -397,9 +408,9 @@ namespace MQTTnet.Core.Tests
Assert.AreEqual(expectedBase64Value, Convert.ToBase64String(Join(chunks))); 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); var buffer1 = serializer.Serialize(packet);