Do not store ec=session_expired if the client never subscribed

Summary: related to T13152

Reviewers: ivica

Reviewed By: ivica

Subscribers: miljen, iljazovic

Differential Revision: https://repo.mireo.local/D26803
This commit is contained in:
Korina Šimičević committed 2023-12-01 15:49:02 +01:00
1 parent 459738a436
commit 64a003e2ed
9 files changed
+69 -50

No files matched your search

+12 -1
View File
@@ -39,12 +39,23 @@ class session_state {
uint8_t _flags = 0b00;
static constexpr uint8_t session_present_flag = 0b01;
static constexpr uint8_t subscriptions_present_flag = 0b10;
public:
void session_present(bool present) {
return update_flag(present, session_present_flag);
}
bool session_present() const { return _flags & session_present_flag; };
bool session_present() const {
return _flags & session_present_flag;
}
void subscriptions_present(bool present) {
return update_flag(present, subscriptions_present_flag);
}
bool subscriptions_present() const {
return _flags & subscriptions_present_flag;
}
private:
void update_flag(bool set, uint8_t flag) {
+32 -3
View File
@@ -3,8 +3,8 @@
#include <boost/asio/experimental/basic_concurrent_channel.hpp>
#include <async_mqtt5/detail/internal_types.hpp>
#include <async_mqtt5/detail/channel_traits.hpp>
#include <async_mqtt5/detail/internal_types.hpp>
#include <async_mqtt5/impl/assemble_op.hpp>
#include <async_mqtt5/impl/async_sender.hpp>
@@ -40,6 +40,14 @@ public:
return _tls_context;
}
auto& session_state() {
return _mqtt_context.session_state;
}
const auto& session_state() const {
return _mqtt_context.session_state;
}
void will(will will) {
_mqtt_context.will = std::move(will);
}
@@ -78,6 +86,14 @@ public:
return _mqtt_context;
}
auto& session_state() {
return _mqtt_context.session_state;
}
const auto& session_state() const {
return _mqtt_context.session_state;
}
void will(will will) {
_mqtt_context.will = std::move(will);
}
@@ -289,12 +305,25 @@ public:
);
}
bool subscriptions_present() const {
return _stream_context.session_state().subscriptions_present();
}
void subscriptions_present(bool present) {
_stream_context.session_state().subscriptions_present(present);
}
void update_session_state() {
auto& session_state = _stream_context.mqtt_context().session_state;
auto& session_state = _stream_context.session_state();
if (!session_state.session_present()) {
channel_store_error(client::error::session_expired);
_replies.clear_pending_pubrels();
session_state.session_present(true);
if (session_state.subscriptions_present()) {
channel_store_error(client::error::session_expired);
session_state.subscriptions_present(false);
}
}
}
+11
View File
@@ -1,6 +1,8 @@
#ifndef ASYNC_MQTT5_SUBSCRIBE_OP_HPP
#define ASYNC_MQTT5_SUBSCRIBE_OP_HPP
#include <algorithm>
#include <boost/asio/detached.hpp>
#include <async_mqtt5/error.hpp>
@@ -173,6 +175,15 @@ private:
error_code ec, uint16_t packet_id,
std::vector<reason_code> reason_codes, suback_props props
) {
if (!_svc_ptr->subscriptions_present()) {
bool has_success_rc = std::any_of(
reason_codes.cbegin(), reason_codes.cend(),
[](const reason_code& rc) { return !rc; }
);
if (has_success_rc)
_svc_ptr->subscriptions_present(true);
}
_svc_ptr->free_pid(packet_id);
_handler.complete(ec, std::move(reason_codes), std::move(props));
}