mirror of
https://github.com/mochi-mqtt/server.git
synced 2026-04-22 15:47:07 +08:00
add 0x04 Reason Code functionality (#395)
* add 0x04 Reason Code functionality * fix tpackets test * simplify logic --------- Co-authored-by: Derek Duncan <derekduncan@gmail.com>
This commit is contained in:
@@ -201,6 +201,7 @@ const (
|
||||
TDisconnect
|
||||
TDisconnectTakeover
|
||||
TDisconnectMqtt5
|
||||
TDisconnectMqtt5DisconnectWithWillMessage
|
||||
TDisconnectSecondConnect
|
||||
TDisconnectReceiveMaximum
|
||||
TDisconnectDropProperties
|
||||
@@ -3781,6 +3782,31 @@ var TPacketData = map[byte]TPacketCases{
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
Case: TDisconnectMqtt5DisconnectWithWillMessage,
|
||||
Desc: "mqtt5 disconnect with will message",
|
||||
Primary: true,
|
||||
RawBytes: append([]byte{
|
||||
Disconnect << 4, 38, // fixed header
|
||||
CodeDisconnectWillMessage.Code, // Reason Code
|
||||
36, // Properties Length
|
||||
17, 0, 0, 0, 120, // Session Expiry Interval (17)
|
||||
31, 0, 28, // Reason String (31)
|
||||
}, []byte(CodeDisconnectWillMessage.Reason)...),
|
||||
Packet: &Packet{
|
||||
ProtocolVersion: 5,
|
||||
FixedHeader: FixedHeader{
|
||||
Type: Disconnect,
|
||||
Remaining: 22,
|
||||
},
|
||||
ReasonCode: CodeDisconnectWillMessage.Code,
|
||||
Properties: Properties{
|
||||
ReasonString: CodeDisconnectWillMessage.Reason,
|
||||
SessionExpiryInterval: 120,
|
||||
SessionExpiryIntervalFlag: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
Case: TDisconnectSecondConnect,
|
||||
Desc: "second connect packet mqtt5",
|
||||
|
||||
@@ -1393,6 +1393,10 @@ func (s *Server) processDisconnect(cl *Client, pk packets.Packet) error {
|
||||
cl.Properties.Props.SessionExpiryIntervalFlag = true
|
||||
}
|
||||
|
||||
if pk.ReasonCode == packets.CodeDisconnectWillMessage.Code { // [MQTT-3.1.2.5] Non-normative comment
|
||||
return packets.CodeDisconnectWillMessage
|
||||
}
|
||||
|
||||
s.loop.willDelayed.Delete(cl.ID) // [MQTT-3.1.3-9] [MQTT-3.1.2-8]
|
||||
cl.Stop(packets.CodeDisconnect) // [MQTT-3.14.4-2]
|
||||
|
||||
|
||||
@@ -3138,6 +3138,22 @@ func TestServerProcessPacketDisconnectNonZeroExpiryViolation(t *testing.T) {
|
||||
require.ErrorIs(t, err, packets.ErrProtocolViolationZeroNonZeroExpiry)
|
||||
}
|
||||
|
||||
func TestServerProcessPacketDisconnectDisconnectWithWillMessage(t *testing.T) {
|
||||
s := newServer()
|
||||
cl, _, _ := newTestClient()
|
||||
cl.Properties.Props.SessionExpiryInterval = 30
|
||||
cl.Properties.ProtocolVersion = 5
|
||||
|
||||
s.loop.willDelayed.Add(cl.ID, packets.Packet{TopicName: "a/b/c", Payload: []byte("hello")})
|
||||
require.Equal(t, 1, s.loop.willDelayed.Len())
|
||||
|
||||
err := s.processPacket(cl, *packets.TPacketData[packets.Disconnect].Get(packets.TDisconnectMqtt5DisconnectWithWillMessage).Packet)
|
||||
require.Error(t, err)
|
||||
|
||||
require.Equal(t, 1, s.loop.willDelayed.Len())
|
||||
require.False(t, cl.Closed())
|
||||
}
|
||||
|
||||
func TestServerProcessPacketAuth(t *testing.T) {
|
||||
s := newServer()
|
||||
cl, r, w := newTestClient()
|
||||
|
||||
Reference in New Issue
Block a user