Skip to content

Commit 362d656

Browse files
The reason code and property length can be omitted iif the reason code is normal and there are no properties (#107)
1 parent 603ce74 commit 362d656

File tree

2 files changed

+24
-7
lines changed

2 files changed

+24
-7
lines changed

bifromq-mqtt/bifromq-mqtt-server/src/main/java/com/baidu/bifromq/mqtt/handler/v5/MQTT5MessageBuilders.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -715,8 +715,8 @@ public DisconnectBuilder serverReference(String serverReference) {
715715
public MqttMessage build() {
716716
MqttFixedHeader fixedHeader =
717717
new MqttFixedHeader(MqttMessageType.DISCONNECT, false, MqttQoS.AT_MOST_ONCE, false, 0);
718+
MQTT5MessageUtils.MqttPropertiesBuilder propsBuilder = MQTT5MessageUtils.mqttProps();
718719
if (!Strings.isNullOrEmpty(reasonString) || userProps != null || !Strings.isNullOrEmpty(serverReference)) {
719-
MQTT5MessageUtils.MqttPropertiesBuilder propsBuilder = MQTT5MessageUtils.mqttProps();
720720
if (!Strings.isNullOrEmpty(reasonString)) {
721721
propsBuilder.addReasonString(reasonString);
722722
}
@@ -726,12 +726,16 @@ public MqttMessage build() {
726726
if (userProps != null) {
727727
propsBuilder.addUserProperties(userProps);
728728
}
729-
MqttReasonCodeAndPropertiesVariableHeader variableHeader =
730-
new MqttReasonCodeAndPropertiesVariableHeader(reasonCode.value(), propsBuilder.build());
731-
return new MqttMessage(fixedHeader, variableHeader);
732729
}
733-
return new MqttMessage(fixedHeader);
734-
730+
MqttProperties mqttProperties = propsBuilder.build();
731+
if (reasonCode == MQTT5DisconnectReasonCode.Normal && mqttProperties.isEmpty()) {
732+
// The Reason Code and Property Length can be omitted if the Reason Code is 0x00 (Normal disconnection)
733+
// and there are no Properties
734+
return new MqttMessage(fixedHeader);
735+
}
736+
MqttReasonCodeAndPropertiesVariableHeader variableHeader =
737+
new MqttReasonCodeAndPropertiesVariableHeader(reasonCode.value(), mqttProperties);
738+
return new MqttMessage(fixedHeader, variableHeader);
735739
}
736740
}
737741

bifromq-mqtt/bifromq-mqtt-server/src/test/java/com/baidu/bifromq/mqtt/utils/MQTT5MessageSizerTest.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,8 +237,21 @@ public void testDisconnect() {
237237
.reasonCode(MQTT5DisconnectReasonCode.Normal)
238238
.build();
239239
verifySize(message);
240-
}
241240

241+
message = MQTT5MessageBuilders.disconnect()
242+
.reasonCode(MQTT5DisconnectReasonCode.Normal)
243+
.reasonString("disconnected")
244+
.build();
245+
verifySize(message);
246+
247+
message = MQTT5MessageBuilders.disconnect()
248+
.reasonCode(MQTT5DisconnectReasonCode.PacketTooLarge)
249+
.reasonString("packet toolarge")
250+
.userProps(UserProperties.newBuilder()
251+
.addUserProperties(StringPair.newBuilder().setKey("key").setValue("val").build()).build())
252+
.build();
253+
verifySize(message);
254+
}
242255

243256
private void verifySize(MqttMessage message) {
244257
IMQTTMessageSizer.MqttMessageSize calcSize = sizer.sizeOf(message);

0 commit comments

Comments
 (0)