diff options
author | Jurek <git@jurek.io> | 2024-05-21 15:31:29 +0200 |
---|---|---|
committer | Jurek <git@jurek.io> | 2024-05-21 15:31:29 +0200 |
commit | e8803d0d998cb67e7552b66040baea2e4a5149aa (patch) | |
tree | e8bf4b7111a23f5a03066110546809ab43093d65 | |
parent | 061ebe6790607f1daa4d8fd0977e71542b9c072e (diff) |
[serialize] adding short disconnect msg support
Signed-off-by: Jurek <git@jurek.io>
-rw-r--r-- | mqtt-format/src/v5/packets/disconnect.rs | 29 | ||||
-rw-r--r-- | mqtt-format/src/v5/packets/mod.rs | 9 |
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)?; } |