diff --git a/bifromq-mqtt/bifromq-mqtt-server/src/main/java/com/baidu/bifromq/mqtt/handler/v5/MQTT5MessageBuilders.java b/bifromq-mqtt/bifromq-mqtt-server/src/main/java/com/baidu/bifromq/mqtt/handler/v5/MQTT5MessageBuilders.java index c479ab01b..4b6f329ab 100644 --- a/bifromq-mqtt/bifromq-mqtt-server/src/main/java/com/baidu/bifromq/mqtt/handler/v5/MQTT5MessageBuilders.java +++ b/bifromq-mqtt/bifromq-mqtt-server/src/main/java/com/baidu/bifromq/mqtt/handler/v5/MQTT5MessageBuilders.java @@ -715,8 +715,8 @@ public DisconnectBuilder serverReference(String serverReference) { public MqttMessage build() { MqttFixedHeader fixedHeader = new MqttFixedHeader(MqttMessageType.DISCONNECT, false, MqttQoS.AT_MOST_ONCE, false, 0); + MQTT5MessageUtils.MqttPropertiesBuilder propsBuilder = MQTT5MessageUtils.mqttProps(); if (!Strings.isNullOrEmpty(reasonString) || userProps != null || !Strings.isNullOrEmpty(serverReference)) { - MQTT5MessageUtils.MqttPropertiesBuilder propsBuilder = MQTT5MessageUtils.mqttProps(); if (!Strings.isNullOrEmpty(reasonString)) { propsBuilder.addReasonString(reasonString); } @@ -726,12 +726,16 @@ public MqttMessage build() { if (userProps != null) { propsBuilder.addUserProperties(userProps); } - MqttReasonCodeAndPropertiesVariableHeader variableHeader = - new MqttReasonCodeAndPropertiesVariableHeader(reasonCode.value(), propsBuilder.build()); - return new MqttMessage(fixedHeader, variableHeader); } - return new MqttMessage(fixedHeader); - + MqttProperties mqttProperties = propsBuilder.build(); + if (reasonCode == MQTT5DisconnectReasonCode.Normal && mqttProperties.isEmpty()) { + // The Reason Code and Property Length can be omitted if the Reason Code is 0x00 (Normal disconnection) + // and there are no Properties + return new MqttMessage(fixedHeader); + } + MqttReasonCodeAndPropertiesVariableHeader variableHeader = + new MqttReasonCodeAndPropertiesVariableHeader(reasonCode.value(), mqttProperties); + return new MqttMessage(fixedHeader, variableHeader); } } diff --git a/bifromq-mqtt/bifromq-mqtt-server/src/test/java/com/baidu/bifromq/mqtt/utils/MQTT5MessageSizerTest.java b/bifromq-mqtt/bifromq-mqtt-server/src/test/java/com/baidu/bifromq/mqtt/utils/MQTT5MessageSizerTest.java index 632f1457a..7a9b2ff31 100644 --- a/bifromq-mqtt/bifromq-mqtt-server/src/test/java/com/baidu/bifromq/mqtt/utils/MQTT5MessageSizerTest.java +++ b/bifromq-mqtt/bifromq-mqtt-server/src/test/java/com/baidu/bifromq/mqtt/utils/MQTT5MessageSizerTest.java @@ -237,8 +237,21 @@ public void testDisconnect() { .reasonCode(MQTT5DisconnectReasonCode.Normal) .build(); verifySize(message); - } + message = MQTT5MessageBuilders.disconnect() + .reasonCode(MQTT5DisconnectReasonCode.Normal) + .reasonString("disconnected") + .build(); + verifySize(message); + + message = MQTT5MessageBuilders.disconnect() + .reasonCode(MQTT5DisconnectReasonCode.PacketTooLarge) + .reasonString("packet toolarge") + .userProps(UserProperties.newBuilder() + .addUserProperties(StringPair.newBuilder().setKey("key").setValue("val").build()).build()) + .build(); + verifySize(message); + } private void verifySize(MqttMessage message) { IMQTTMessageSizer.MqttMessageSize calcSize = sizer.sizeOf(message);