diff options
author | Konstantin Ritt <ritt.ks@gmail.com> | 2020-05-07 03:46:55 +0300 |
---|---|---|
committer | Maurice Kalinowski <maurice.kalinowski@qt.io> | 2020-05-15 18:58:30 +0200 |
commit | e6c2ddfc2a01c0cc4e3b5790b0de2a7dc3947581 (patch) | |
tree | 9744ddc884b83ae04a331f6fe5f939e7e3532166 | |
parent | a5facff1658a0e4e2b6deddc1a77675be51056cc (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.cpp | 38 |
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() |