summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJurek <git@jurek.io>2024-05-21 15:31:29 +0200
committerJurek <git@jurek.io>2024-05-21 15:31:29 +0200
commite8803d0d998cb67e7552b66040baea2e4a5149aa (patch)
treee8bf4b7111a23f5a03066110546809ab43093d65
parent061ebe6790607f1daa4d8fd0977e71542b9c072e (diff)
[serialize] adding short disconnect msg support
Signed-off-by: Jurek <git@jurek.io>
-rw-r--r--mqtt-format/src/v5/packets/disconnect.rs29
-rw-r--r--mqtt-format/src/v5/packets/mod.rs9
2 files changed, 37 insertions, 1 deletions
diff --git a/mqtt-format/src/v5/packets/disconnect.rs b/mqtt-format/src/v5/packets/disconnect.rs
index a03fa95..f8855e8 100644
--- a/mqtt-format/src/v5/packets/disconnect.rs
+++ b/mqtt-format/src/v5/packets/disconnect.rs
@@ -157,7 +157,34 @@ mod test {
reason_code: DisconnectReasonCode::NormalDisconnection,
properties: DisconnectProperties::new(),
});
-
assert_eq!(parsed, reference);
}
+
+ #[test]
+ fn test_short_disconnect_encoding() {
+ let reference = MqttPacket::Disconnect(MDisconnect {
+ reason_code: DisconnectReasonCode::NormalDisconnection,
+ properties: DisconnectProperties::new(),
+ });
+ let mut writer = crate::v5::test::TestWriter { buffer: Vec::new() };
+ reference.write(&mut writer).unwrap();
+ let buf = [0xe0, 0x00];
+ assert_eq!(writer.buffer, buf);
+ }
+
+ #[test]
+ fn test_short_disconnect_long_encoding() {
+ let reference = MqttPacket::Disconnect(MDisconnect {
+ reason_code: DisconnectReasonCode::NormalDisconnection,
+ properties: DisconnectProperties {
+ session_expiry_interval: Some(SessionExpiryInterval(123)),
+ reason_string: None,
+ user_properties: None,
+ server_reference: None,
+ },
+ });
+ let mut writer = crate::v5::test::TestWriter { buffer: Vec::new() };
+ reference.write(&mut writer).unwrap();
+ assert!(writer.buffer.len() > 2, "the extra rule for short NormalDisconnect should not influence more complex disconnects");
+ }
}
diff --git a/mqtt-format/src/v5/packets/mod.rs b/mqtt-format/src/v5/packets/mod.rs
index 9c7172a..55b39b8 100644
--- a/mqtt-format/src/v5/packets/mod.rs
+++ b/mqtt-format/src/v5/packets/mod.rs
@@ -29,6 +29,7 @@ use super::write::WResult;
use super::write::WriteMqttPacket;
use crate::v5::fixed_header::MFixedHeader;
use crate::v5::packets::connack::MConnack;
+use crate::v5::packets::disconnect::{DisconnectProperties, DisconnectReasonCode};
use crate::v5::MResult;
pub mod auth;
@@ -162,6 +163,14 @@ impl<'i> MqttPacket<'i> {
packet_type: PacketType::Disconnect,
};
fixed_header.write(buffer)?;
+ // if reason code is NormalDisconnection AND properties are empty, we can skip writing the payload
+ if p.reason_code == DisconnectReasonCode::NormalDisconnection
+ && p.properties == DisconnectProperties::new()
+ {
+ // writing length of packet 0
+ crate::v5::integers::write_variable_u32(buffer, 0)?;
+ return Ok(());
+ }
crate::v5::integers::write_variable_u32(buffer, p.binary_size())?;
p.write(buffer)?;
}