Skip to content

Commit 58be7b1

Browse files
authored
Fix QoS2 message receive procedure (#19)
1 parent 2d271ca commit 58be7b1

File tree

1 file changed

+18
-3
lines changed

1 file changed

+18
-3
lines changed

serve.go

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ func (c *BaseClient) serve() error {
1313
close(c.connClosed)
1414
}()
1515
r := c.Transport
16+
subBuffer := make(map[uint16]*Message)
1617
for {
1718
pktTypeBytes := make([]byte, 1)
1819
if _, err := io.ReadFull(r, pktTypeBytes); err != nil {
@@ -45,18 +46,23 @@ func (c *BaseClient) serve() error {
4546
}
4647
case packetPublish:
4748
publish := (&pktPublish{}).parse(pktFlag, contents)
48-
if c.Handler != nil {
49-
c.Handler.Serve(&publish.Message)
50-
}
5149
switch publish.Message.QoS {
50+
case QoS0:
51+
if c.Handler != nil {
52+
c.Handler.Serve(&publish.Message)
53+
}
5254
case QoS1:
55+
// Ownership of the message is now transferred to the receiver.
5356
pktPubAck := pack(
5457
packetPubAck.b()|packetFromClient.b(),
5558
packUint16(publish.Message.ID),
5659
)
5760
if err := c.write(pktPubAck); err != nil {
5861
return err
5962
}
63+
if c.Handler != nil {
64+
c.Handler.Serve(&publish.Message)
65+
}
6066
case QoS2:
6167
pktPubRec := pack(
6268
packetPubRec.b()|packetFromClient.b(),
@@ -65,6 +71,7 @@ func (c *BaseClient) serve() error {
6571
if err := c.write(pktPubRec); err != nil {
6672
return err
6773
}
74+
subBuffer[publish.Message.ID] = &publish.Message
6875
}
6976
case packetPubAck:
7077
pubAck := (&pktPubAck{}).parse(pktFlag, contents)
@@ -84,6 +91,14 @@ func (c *BaseClient) serve() error {
8491
}
8592
case packetPubRel:
8693
pubRel := (&pktPubRel{}).parse(pktFlag, contents)
94+
if msg, ok := subBuffer[pubRel.ID]; ok {
95+
// Ownership of the message is now transferred to the receiver.
96+
if c.Handler != nil {
97+
c.Handler.Serve(msg)
98+
}
99+
delete(subBuffer, pubRel.ID)
100+
}
101+
87102
pktPubComp := pack(
88103
packetPubComp.b()|packetFromClient.b(),
89104
packUint16(pubRel.ID),

0 commit comments

Comments
 (0)