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)
{
@@ -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);
@@ -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);