From 55ad0e8b799ea20a89aabc58794581a083611b10 Mon Sep 17 00:00:00 2001 From: Pete Fawcett Date: Wed, 2 Dec 2020 18:56:45 +0000 Subject: [PATCH] Allow setting of connection properties via connection_options Allow access to properties on incoming connections --- cpp/include/proton/connection.hpp | 5 +++++ cpp/include/proton/connection_options.hpp | 4 ++++ cpp/src/connection.cpp | 10 ++++++++++ cpp/src/connection_options.cpp | 6 ++++++ cpp/src/container_test.cpp | 18 ++++++++++++++++++ 5 files changed, 43 insertions(+) diff --git a/cpp/include/proton/connection.hpp b/cpp/include/proton/connection.hpp index 2dcfb16b68..7509d4312f 100644 --- a/cpp/include/proton/connection.hpp +++ b/cpp/include/proton/connection.hpp @@ -28,9 +28,11 @@ #include "./endpoint.hpp" #include "./session.hpp" #include "./symbol.hpp" +#include "./value.hpp" #include +#include #include /// @file @@ -150,6 +152,9 @@ PN_CPP_CLASS_EXTERN connection : public internal::object, publi /// **Unsettled API** - Extension capabilities desired by the remote peer. PN_CPP_EXTERN std::vector desired_capabilities() const; + /// **Unsettled API** - Connection properties + PN_CPP_EXTERN std::map properties() const; + /// Get the idle timeout set by the remote peer. /// /// @see @ref connection_options::idle_timeout diff --git a/cpp/include/proton/connection_options.hpp b/cpp/include/proton/connection_options.hpp index d139251f02..02d0ff6ba4 100644 --- a/cpp/include/proton/connection_options.hpp +++ b/cpp/include/proton/connection_options.hpp @@ -32,6 +32,7 @@ #include +#include #include #include @@ -162,6 +163,9 @@ class connection_options { /// **Unsettled API** - Extension capabilities desired from the remote peer. PN_CPP_EXTERN connection_options& desired_capabilities(const std::vector&); + /// **Unsettled API** - Connection properties. + PN_CPP_EXTERN connection_options& properties(const std::map&); + /// **Unsettled API** - Set the SASL configuration name. PN_CPP_EXTERN connection_options& sasl_config_name(const std::string&); diff --git a/cpp/src/connection.cpp b/cpp/src/connection.cpp index c6686aee47..ba89430cf8 100644 --- a/cpp/src/connection.cpp +++ b/cpp/src/connection.cpp @@ -21,6 +21,7 @@ #include "proton_bits.hpp" +#include "proton/codec/map.hpp" #include "proton/codec/vector.hpp" #include "proton/connection.hpp" #include "proton/connection_options.hpp" @@ -192,6 +193,15 @@ std::vector connection::desired_capabilities() const { return get_multiple >(caps); } +std::map connection::properties() const { + std::map props_ret; + value props(pn_connection_remote_properties(pn_object())); + if (!props.empty()) { + get(props, props_ret); + } + return props_ret; +} + bool connection::reconnected() const { connection_context& cc = connection_context::get(pn_object()); reconnect_context* rc = cc.reconnect_context_.get(); diff --git a/cpp/src/connection_options.cpp b/cpp/src/connection_options.cpp index 4e2bb3ef55..6ae8d0fafe 100644 --- a/cpp/src/connection_options.cpp +++ b/cpp/src/connection_options.cpp @@ -21,6 +21,7 @@ #include "proton/connection_options.hpp" #include "proton/connection.hpp" +#include #include "proton/codec/vector.hpp" #include "proton/fwd.hpp" #include "proton/messaging_handler.hpp" @@ -63,6 +64,7 @@ class connection_options::impl { option password; option > offered_capabilities; option > desired_capabilities; + option > properties; option reconnect; option reconnect_url; option > failover_urls; @@ -108,6 +110,8 @@ class connection_options::impl { value(pn_connection_offered_capabilities(pnc)) = offered_capabilities.value; if (desired_capabilities.set) value(pn_connection_desired_capabilities(pnc)) = desired_capabilities.value; + if (properties.set) + value(pn_connection_properties(pnc)) = properties.value; } void apply_reconnect_urls(pn_connection_t* pnc) { @@ -194,6 +198,7 @@ class connection_options::impl { password.update(x.password); offered_capabilities.update(x.offered_capabilities); desired_capabilities.update(x.desired_capabilities); + properties.update(x.properties); reconnect.update(x.reconnect); reconnect_url.update(x.reconnect_url); failover_urls.update(x.failover_urls); @@ -238,6 +243,7 @@ connection_options& connection_options::user(const std::string &user) { impl_->u connection_options& connection_options::password(const std::string &password) { impl_->password = password; return *this; } connection_options& connection_options::offered_capabilities(const std::vector &caps) { impl_->offered_capabilities = caps; return *this; } connection_options& connection_options::desired_capabilities(const std::vector &caps) { impl_->desired_capabilities = caps; return *this; } +connection_options& connection_options::properties(const std::map &props) { impl_->properties = props; return *this; } connection_options& connection_options::reconnect(const reconnect_options &r) { if (!r.impl_->failover_urls.empty()) { impl_->failover_urls = r.impl_->failover_urls; diff --git a/cpp/src/container_test.cpp b/cpp/src/container_test.cpp index 1866e6b480..a3e8b56a99 100644 --- a/cpp/src/container_test.cpp +++ b/cpp/src/container_test.cpp @@ -90,6 +90,7 @@ class test_handler : public proton::messaging_handler { std::string peer_container_id; std::vector peer_offered_capabilities; std::vector peer_desired_capabilities; + std::map peer_properties; proton::listener listener; test_listen_handler listen_handler; @@ -112,6 +113,7 @@ class test_handler : public proton::messaging_handler { peer_container_id = c.container_id(); peer_offered_capabilities = c.offered_capabilities(); peer_desired_capabilities = c.desired_capabilities(); + peer_properties = c.properties(); c.close(); } closing = true; @@ -179,6 +181,21 @@ int test_container_capabilities() { ASSERT_EQUAL(th.peer_offered_capabilities[0], proton::symbol("offered")); ASSERT_EQUAL(th.peer_desired_capabilities.size(), 1u); ASSERT_EQUAL(th.peer_desired_capabilities[0], proton::symbol("desired")); + ASSERT_EQUAL(th.peer_properties.size(), 0u); + return 0; +} + +int test_container_properties() { + proton::connection_options opts; + std::map props; + props["qpid.client_process"] = "test_process"; + props["qpid.client_pid"] = 123; + opts.properties(props); + test_handler th("", opts); + proton::container(th).run(); + ASSERT_EQUAL(th.peer_properties.size(), 2u); + ASSERT_EQUAL(th.peer_properties["qpid.client_process"], "test_process"); + ASSERT_EQUAL(th.peer_properties["qpid.client_pid"], 123); return 0; } @@ -475,6 +492,7 @@ int main(int argc, char** argv) { RUN_ARGV_TEST(failed, test_container_default_container_id()); RUN_ARGV_TEST(failed, test_container_vhost()); RUN_ARGV_TEST(failed, test_container_capabilities()); + RUN_ARGV_TEST(failed, test_container_properties()); RUN_ARGV_TEST(failed, test_container_default_vhost()); RUN_ARGV_TEST(failed, test_container_no_vhost()); RUN_ARGV_TEST(failed, test_container_bad_address());