summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKonstantin Ritt <ritt.ks@gmail.com>2020-05-07 03:46:55 +0300
committerMaurice Kalinowski <maurice.kalinowski@qt.io>2020-05-15 18:58:30 +0200
commite6c2ddfc2a01c0cc4e3b5790b0de2a7dc3947581 (patch)
tree9744ddc884b83ae04a331f6fe5f939e7e3532166
parenta5facff1658a0e4e2b6deddc1a77675be51056cc (diff)
MQTT 5: respect UNSUBACK Properties and Reason Code
UNSUBACK supported properties are exactly the same as SUBACK ones, so re-use the existing readSubscriptionProperties() implementation. Change-Id: I1d3d99f33d44882505960b603a07237c2a578dcb Reviewed-by: Maurice Kalinowski <maurice.kalinowski@qt.io>
-rw-r--r--src/mqtt/qmqttconnection.cpp38
1 files changed, 37 insertions, 1 deletions
diff --git a/src/mqtt/qmqttconnection.cpp b/src/mqtt/qmqttconnection.cpp
index de2e4b2..55fb86f 100644
--- a/src/mqtt/qmqttconnection.cpp
+++ b/src/mqtt/qmqttconnection.cpp
@@ -1578,8 +1578,44 @@ void QMqttConnection::finalize_unsuback()
return;
}
- sub->setState(QMqttSubscription::Unsubscribed);
m_activeSubscriptions.remove(sub->topic());
+
+ if (m_clientPrivate->m_protocolVersion == QMqttClient::MQTT_5_0) {
+ readSubscriptionProperties(sub);
+ } else {
+ // 3.11.3 - The UNSUBACK Packet has no payload.
+ // emulate successful unsubscription
+ sub->d_func()->m_reasonCode = QMqtt::ReasonCode::Success;
+ sub->setState(QMqttSubscription::Unsubscribed);
+ return;
+ }
+
+ // 3.1.3 - The Payload contains a list of Reason Codes. Each Reason Code corresponds to a Topic Filter in the UNSUBSCRIBE packet being acknowledged.
+ // Whereas 3.10.3 states "The Payload of an UNSUBSCRIBE packet MUST contain at least one Topic Filter. An UNSUBSCRIBE packet with no Payload is a Protocol Error."
+ do {
+ const quint8 reasonCode = readBufferTyped<quint8>(&m_missingData);
+ sub->d_func()->m_reasonCode = QMqtt::ReasonCode(reasonCode);
+
+ // 3.11.3
+ switch (QMqtt::ReasonCode(reasonCode)) {
+ case QMqtt::ReasonCode::Success:
+ sub->setState(QMqttSubscription::Unsubscribed);
+ break;
+ case QMqtt::ReasonCode::NoSubscriptionExisted:
+ case QMqtt::ReasonCode::ImplementationSpecificError:
+ case QMqtt::ReasonCode::NotAuthorized:
+ case QMqtt::ReasonCode::InvalidTopicFilter:
+ case QMqtt::ReasonCode::MessageIdInUse:
+ case QMqtt::ReasonCode::UnspecifiedError:
+ qCWarning(lcMqttConnection) << "Unsubscription for id " << id << " failed. Reason Code:" << reasonCode;
+ sub->setState(QMqttSubscription::Error);
+ break;
+ default:
+ qCWarning(lcMqttConnection) << "Received illegal UNSUBACK reason code:" << reasonCode;
+ closeConnection(QMqttClient::ProtocolViolation);
+ break;
+ }
+ } while (m_missingData > 0);
}
void QMqttConnection::finalize_publish()