@@ -35,6 +35,10 @@ protocol CocoaMQTTReaderDelegate: AnyObject {
3535 func didReceive( _ reader: CocoaMQTTReader , unsuback: FrameUnsubAck )
3636
3737 func didReceive( _ reader: CocoaMQTTReader , pingresp: FramePingResp )
38+
39+ func didReceive( _ reader: CocoaMQTTReader , disconnect: FrameDisconnect )
40+
41+ func didReceive( _ reader: CocoaMQTTReader , auth: FrameAuth )
3842}
3943
4044class CocoaMQTTReader {
@@ -109,8 +113,7 @@ class CocoaMQTTReader {
109113 private func frameReady( ) {
110114
111115 guard let frameType = FrameType ( rawValue: UInt8 ( header & 0xF0 ) ) else {
112- printError ( " Received unknown frame type, header: \( header) , data: \( data) " )
113- readHeader ( )
116+ protocolError ( " Received unknown frame type, header: \( header) , data: \( data) " )
114117 return
115118 }
116119
@@ -119,65 +122,95 @@ class CocoaMQTTReader {
119122 switch frameType {
120123 case . connack:
121124 guard let connack = FrameConnAck ( packetFixedHeaderType: header, bytes: data) else {
122- printError ( " Reader parse \( frameType) failed, data: \( data) " )
123- break
125+ protocolError ( " Reader parse \( frameType) failed, data: \( data) " )
126+ return
124127 }
125128 delegate? . didReceive ( self , connack: connack)
126129 case . publish:
127130 guard let publish = FramePublish ( packetFixedHeaderType: header, bytes: data) else {
128- printError ( " Reader parse \( frameType) failed, data: \( data) " )
129- break
131+ protocolError ( " Reader parse \( frameType) failed, data: \( data) " )
132+ return
130133 }
131134 delegate? . didReceive ( self , publish: publish)
132135 case . puback:
133136 guard let puback = FramePubAck ( packetFixedHeaderType: header, bytes: data) else {
134- printError ( " Reader parse \( frameType) failed, data: \( data) " )
135- break
137+ protocolError ( " Reader parse \( frameType) failed, data: \( data) " )
138+ return
136139 }
137140 delegate? . didReceive ( self , puback: puback)
138141 case . pubrec:
139142 guard let pubrec = FramePubRec ( packetFixedHeaderType: header, bytes: data) else {
140- printError ( " Reader parse \( frameType) failed, data: \( data) " )
141- break
143+ protocolError ( " Reader parse \( frameType) failed, data: \( data) " )
144+ return
142145 }
143146 delegate? . didReceive ( self , pubrec: pubrec)
144147 case . pubrel:
145148 guard let pubrel = FramePubRel ( packetFixedHeaderType: header, bytes: data) else {
146- printError ( " Reader parse \( frameType) failed, data: \( data) " )
147- break
149+ protocolError ( " Reader parse \( frameType) failed, data: \( data) " )
150+ return
148151 }
149152 delegate? . didReceive ( self , pubrel: pubrel)
150153 case . pubcomp:
151154 guard let pubcomp = FramePubComp ( packetFixedHeaderType: header, bytes: data) else {
152- printError ( " Reader parse \( frameType) failed, data: \( data) " )
153- break
155+ protocolError ( " Reader parse \( frameType) failed, data: \( data) " )
156+ return
154157 }
155158 delegate? . didReceive ( self , pubcomp: pubcomp)
156159 case . suback:
157160 guard let frame = FrameSubAck ( packetFixedHeaderType: header, bytes: data) else {
158- printError ( " Reader parse \( frameType) failed, data: \( data) " )
159- break
161+ protocolError ( " Reader parse \( frameType) failed, data: \( data) " )
162+ return
160163 }
161164 delegate? . didReceive ( self , suback: frame)
162165 case . unsuback:
163166 guard let frame = FrameUnsubAck ( packetFixedHeaderType: header, bytes: data) else {
164- printError ( " Reader parse \( frameType) failed, data: \( data) " )
165- break
167+ protocolError ( " Reader parse \( frameType) failed, data: \( data) " )
168+ return
166169 }
167170 delegate? . didReceive ( self , unsuback: frame)
168171 case . pingresp:
169172 guard let frame = FramePingResp ( packetFixedHeaderType: header, bytes: data) else {
170- printError ( " Reader parse \( frameType) failed, data: \( data) " )
171- break
173+ protocolError ( " Reader parse \( frameType) failed, data: \( data) " )
174+ return
172175 }
173176 delegate? . didReceive ( self , pingresp: frame)
177+ case . disconnect:
178+ guard isMQTT5ProtocolVersion ( ) else {
179+ protocolError ( " Reader received MQTT5-only frame \( frameType) in non-MQTT5 mode, data: \( data) " )
180+ return
181+ }
182+ guard let frame = FrameDisconnect ( packetFixedHeaderType: header, bytes: data) else {
183+ protocolError ( " Reader parse \( frameType) failed, data: \( data) " )
184+ return
185+ }
186+ delegate? . didReceive ( self , disconnect: frame)
187+ case . auth:
188+ guard isMQTT5ProtocolVersion ( ) else {
189+ protocolError ( " Reader received MQTT5-only frame \( frameType) in non-MQTT5 mode, data: \( data) " )
190+ return
191+ }
192+ guard let frame = FrameAuth ( packetFixedHeaderType: header, bytes: data) else {
193+ protocolError ( " Reader parse \( frameType) failed, data: \( data) " )
194+ return
195+ }
196+ delegate? . didReceive ( self , auth: frame)
174197 default :
175- break
198+ protocolError ( " Received unsupported frame type \( frameType) , data: \( data) " )
199+ return
176200 }
177201
178202 readHeader ( )
179203 }
180204
205+ private func protocolError( _ reason: String ) {
206+ printError ( reason)
207+ socket. disconnect ( )
208+ }
209+
210+ private func isMQTT5ProtocolVersion( ) -> Bool {
211+ return CocoaMQTTStorage ( ) ? . queryMQTTVersion ( ) == " 5.0 "
212+ }
213+
181214 private func reset( ) {
182215 length = 0
183216 multiply = 1
0 commit comments