From 6c15693456821dc03d2cf6a95ce9babddf0d24bf Mon Sep 17 00:00:00 2001 From: Christian Kratky Date: Mon, 9 Nov 2020 17:22:32 +0100 Subject: [PATCH] Add support for TopicAlias in application message builder. --- .../Formatter/V5/MqttV500PacketEncoder.cs | 17 +++++++++++------ Source/MQTTnet/MqttApplicationMessageBuilder.cs | 9 +++++++-- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/Source/MQTTnet/Formatter/V5/MqttV500PacketEncoder.cs b/Source/MQTTnet/Formatter/V5/MqttV500PacketEncoder.cs index bf978c4b..a6e259db 100644 --- a/Source/MQTTnet/Formatter/V5/MqttV500PacketEncoder.cs +++ b/Source/MQTTnet/Formatter/V5/MqttV500PacketEncoder.cs @@ -251,13 +251,18 @@ namespace MQTTnet.Formatter.V5 var propertiesWriter = new MqttV500PropertiesWriter(); if (packet.Properties != null) { - propertiesWriter.WritePayloadFormatIndicator(packet.Properties.PayloadFormatIndicator); - propertiesWriter.WriteMessageExpiryInterval(packet.Properties.MessageExpiryInterval); - propertiesWriter.WriteTopicAlias(packet.Properties.TopicAlias); - propertiesWriter.WriteResponseTopic(packet.Properties.ResponseTopic); - propertiesWriter.WriteCorrelationData(packet.Properties.CorrelationData); - propertiesWriter.WriteSubscriptionIdentifiers(packet.Properties.SubscriptionIdentifiers); + if (packet.Properties.TopicAlias == 0) + { + throw new MqttProtocolViolationException("A Topic Alias of 0 is not permitted. A sender MUST NOT send a PUBLISH packet containing a Topic Alias which has the value 0 [MQTT-3.3.2-8]."); + } + propertiesWriter.WriteContentType(packet.Properties.ContentType); + propertiesWriter.WriteCorrelationData(packet.Properties.CorrelationData); + propertiesWriter.WriteMessageExpiryInterval(packet.Properties.MessageExpiryInterval); + propertiesWriter.WritePayloadFormatIndicator(packet.Properties.PayloadFormatIndicator); + propertiesWriter.WriteResponseTopic(packet.Properties.ResponseTopic); + propertiesWriter.WriteSubscriptionIdentifiers(packet.Properties.SubscriptionIdentifiers); + propertiesWriter.WriteTopicAlias(packet.Properties.TopicAlias); propertiesWriter.WriteUserProperties(packet.Properties.UserProperties); } diff --git a/Source/MQTTnet/MqttApplicationMessageBuilder.cs b/Source/MQTTnet/MqttApplicationMessageBuilder.cs index bc2d9b86..7e48531f 100644 --- a/Source/MQTTnet/MqttApplicationMessageBuilder.cs +++ b/Source/MQTTnet/MqttApplicationMessageBuilder.cs @@ -222,9 +222,14 @@ namespace MQTTnet public MqttApplicationMessage Build() { - if (string.IsNullOrEmpty(_topic)) + if (!_topicAlias.HasValue && string.IsNullOrEmpty(_topic)) { - throw new MqttProtocolViolationException("Topic is not set."); + throw new MqttProtocolViolationException("Topic or TopicAlias is not set."); + } + + if (_topicAlias == 0) + { + throw new MqttProtocolViolationException("A Topic Alias of 0 is not permitted. A sender MUST NOT send a PUBLISH packet containing a Topic Alias which has the value 0 [MQTT-3.3.2-8]."); } var applicationMessage = new MqttApplicationMessage