1
0
mirror of https://github.com/qt/qtmqtt.git synced 2026-10-25 16:16:26 +00:00

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>
This commit is contained in:
Konstantin Ritt 2020-05-07 03:46:55 +03:00 committed by Maurice Kalinowski
parent a5facff165
commit e6c2ddfc2a

View File

@ -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()