Skip to content

Commit 93ab6a4

Browse files
committed
Supported request_response_information and response_topic.
1 parent fff2708 commit 93ab6a4

File tree

2 files changed

+78
-5
lines changed

2 files changed

+78
-5
lines changed

include/mqtt/broker/broker.hpp

+14-5
Original file line numberDiff line numberDiff line change
@@ -1014,11 +1014,22 @@ class broker_t {
10141014

10151015
optional<std::chrono::steady_clock::duration> session_expiry_interval;
10161016
optional<std::chrono::steady_clock::duration> will_expiry_interval;
1017+
v5::properties connack_props;
10171018

10181019
if (ep.get_protocol_version() == protocol_version::v5) {
1019-
auto v = get_property<v5::property::session_expiry_interval>(props);
1020-
if (v && v.value().val() != 0) {
1021-
session_expiry_interval.emplace(std::chrono::seconds(v.value().val()));
1020+
{
1021+
auto v = get_property<v5::property::session_expiry_interval>(props);
1022+
if (v && v.value().val() != 0) {
1023+
session_expiry_interval.emplace(std::chrono::seconds(v.value().val()));
1024+
}
1025+
}
1026+
{
1027+
auto v = get_property<v5::property::request_response_information>(props);
1028+
if (v && v.value().val() == 1) {
1029+
connack_props.emplace_back(
1030+
v5::property::response_topic(allocate_buffer(create_uuid_string()))
1031+
);
1032+
}
10221033
}
10231034

10241035
if (will) {
@@ -1033,8 +1044,6 @@ class broker_t {
10331044
}
10341045
}
10351046

1036-
v5::properties connack_props;
1037-
10381047
switch (ep.get_protocol_version()) {
10391048
case protocol_version::v3_1_1:
10401049
if (client_id.empty()) {

test/system/st_connect.cpp

+64
Original file line numberDiff line numberDiff line change
@@ -1936,6 +1936,70 @@ BOOST_AUTO_TEST_CASE( connack_prop ) {
19361936
do_combi_test_sync(test);
19371937
}
19381938

1939+
BOOST_AUTO_TEST_CASE( request_response ) {
1940+
auto test = [](boost::asio::io_context& ioc, auto& cs, auto finish, auto& b) {
1941+
auto& c = cs[0];
1942+
clear_ordered();
1943+
if (c->get_protocol_version() != MQTT_NS::protocol_version::v5) {
1944+
finish();
1945+
return;
1946+
}
1947+
1948+
c->set_client_id("cid1");
1949+
c->set_clean_session(true);
1950+
BOOST_TEST(c->connected() == false);
1951+
1952+
checker chk = {
1953+
// connect
1954+
cont("h_connack"),
1955+
// disconnect
1956+
cont("h_close"),
1957+
};
1958+
1959+
c->set_v5_connack_handler(
1960+
[&chk, &c]
1961+
(bool sp, MQTT_NS::v5::connect_reason_code connect_reason_code, MQTT_NS::v5::properties props) {
1962+
MQTT_CHK("h_connack");
1963+
BOOST_TEST(c->connected() == true);
1964+
BOOST_TEST(sp == false);
1965+
BOOST_TEST(connect_reason_code == MQTT_NS::v5::connect_reason_code::success);
1966+
1967+
std::size_t times = 0;
1968+
MQTT_NS::v5::visit_props(
1969+
props,
1970+
[&](MQTT_NS::v5::property::response_topic const& p) {
1971+
++times;
1972+
},
1973+
[](auto){}
1974+
);
1975+
BOOST_TEST(times == 1);
1976+
1977+
c->disconnect();
1978+
BOOST_TEST(c->connected() == true);
1979+
return true;
1980+
});
1981+
c->set_close_handler(
1982+
[&chk, &finish, &c]
1983+
() {
1984+
MQTT_CHK("h_close");
1985+
finish();
1986+
});
1987+
c->set_error_handler(
1988+
[]
1989+
(MQTT_NS::error_code) {
1990+
BOOST_CHECK(false);
1991+
});
1992+
c->connect(
1993+
MQTT_NS::v5::properties{
1994+
MQTT_NS::v5::property::request_response_information(true)
1995+
}
1996+
);
1997+
ioc.run();
1998+
BOOST_TEST(chk.all());
1999+
};
2000+
do_combi_test_sync(test);
2001+
}
2002+
19392003
BOOST_AUTO_TEST_CASE( session_taken_over ) {
19402004
auto test = [](boost::asio::io_context& ioc, auto& cs, auto finish, auto& /*b*/) {
19412005
auto& c1 = cs[0];

0 commit comments

Comments
 (0)