Allow user to modify CONNECT properties

Summary: related to T13332

Reviewers: ivica

Reviewed By: ivica

Subscribers: miljen, iljazovic

Differential Revision: https://repo.mireo.local/D27108
This commit is contained in:
Korina Šimičević
2023-12-22 13:48:26 +01:00
parent 99f30b3880
commit 7c0b9042d1
9 changed files with 49 additions and 11 deletions

View File

@@ -17,9 +17,13 @@ void publish_qos0_tcp() {
using client_type = mqtt_client<stream_type>;
client_type c(ioc, "");
connect_props props;
props[prop::maximum_packet_size] = 1024;
c.credentials("test-qos0-tcp", "", "")
.brokers("emqtt.mireo.local", 1883)
.will({ "test/mqtt-test", "Client disconnected!",qos_e::at_least_once })
.connect_properties(std::move(props))
.run();
c.async_publish<qos_e::at_most_once>(

View File

@@ -9,7 +9,8 @@
namespace async_mqtt5 {
static constexpr int32_t default_max_packet_size = 65'536;
/* max varint number (268'435'455) + fixed header size (1 + 4) */
static constexpr int32_t default_max_send_size = 268'435'460;
enum class control_code_e : std::uint8_t {
no_packet = 0b00000000, // 0

View File

@@ -52,7 +52,7 @@ class assemble_op {
struct on_read {};
static constexpr size_t max_packet_size = default_max_packet_size;
static constexpr size_t max_recv_size = 65'536;
client_service& _svc;
handler_type _handler;
@@ -88,8 +88,9 @@ public:
_read_buff.erase(
_read_buff.cbegin(), _data_span.first()
);
// TODO: respect max packet size from CONNACK
_read_buff.resize(max_packet_size);
_read_buff.resize(
_svc.connect_prop(prop::maximum_packet_size).value_or(max_recv_size)
);
_data_span = {
_read_buff.cbegin(),
_read_buff.cbegin() + _data_span.size()
@@ -155,8 +156,8 @@ public:
return complete(client::error::malformed_packet, 0, {}, {});
}
// TODO: respect max packet size which could be dinamically set by the broker
if (*varlen > max_packet_size - std::distance(_data_span.first(), first))
auto recv_size = _svc.connect_prop(prop::maximum_packet_size).value_or(max_recv_size);
if (*varlen > recv_size - std::distance(_data_span.first(), first))
return complete(client::error::malformed_packet, 0, {}, {});
if (std::distance(first, _data_span.last()) < *varlen)

View File

@@ -70,6 +70,15 @@ public:
return _mqtt_context.ca_props;
}
template <typename Prop>
const auto& connect_prop(Prop p) const {
return _mqtt_context.co_props[p];
}
void connect_props(connect_props props) {
_mqtt_context.co_props = std::move(props);
}
void credentials(
std::string client_id,
std::string username = "", std::string password = ""
@@ -122,6 +131,15 @@ public:
return _mqtt_context.ca_props;
}
template <typename Prop>
const auto& connect_prop(Prop p) const {
return _mqtt_context.co_props[p];
}
void connect_props(connect_props props) {
_mqtt_context.co_props = std::move(props);
}
void credentials(
std::string client_id,
std::string username = "", std::string password = ""
@@ -248,6 +266,15 @@ public:
);
}
template <typename Prop>
const auto& connect_prop(Prop p) const {
return _stream_context.connect_prop(p);
}
void connect_props(connect_props props) {
if (!is_open())
_stream_context.connect_props(std::move(props));
}
template <typename Prop>
const auto& connack_prop(Prop p) const {

View File

@@ -73,7 +73,7 @@ public:
auto max_packet_size = _svc_ptr->connack_prop(
prop::maximum_packet_size
).value_or(default_max_packet_size);
).value_or(default_max_send_size);
if (disconnect.size() > max_packet_size)
// drop properties
return send_disconnect(control_packet<allocator_type>::of(

View File

@@ -121,7 +121,7 @@ public:
);
auto max_packet_size = _svc_ptr->connack_prop(prop::maximum_packet_size)
.value_or(default_max_packet_size);
.value_or(default_max_send_size);
if (publish.size() > max_packet_size)
return complete_post(client::error::packet_too_large, packet_id);

View File

@@ -81,7 +81,7 @@ public:
);
auto max_packet_size = _svc_ptr->connack_prop(prop::maximum_packet_size)
.value_or(default_max_packet_size);
.value_or(default_max_send_size);
if (subscribe.size() > max_packet_size)
return complete_post(
client::error::packet_too_large, packet_id, topics.size()

View File

@@ -77,7 +77,7 @@ public:
auto max_packet_size = _svc_ptr->connack_prop(
prop::maximum_packet_size
).value_or(default_max_packet_size);
).value_or(default_max_send_size);
if (unsubscribe.size() > max_packet_size)
return complete_post(
client::error::packet_too_large, packet_id, topics.size()

View File

@@ -274,6 +274,11 @@ public:
return *this;
}
mqtt_client& connect_properties(connect_props props) {
_svc_ptr->connect_props(std::move(props));
return *this;
}
/**
* \brief Initiates [mqttlink 3901257 Re-authentication]
* using the authenticator given in the \ref authenticator method.