]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#4274] Checkpoint: add Exchange::create
authorFrancis Dupont <fdupont@isc.org>
Fri, 23 Jan 2026 13:27:09 +0000 (14:27 +0100)
committerFrancis Dupont <fdupont@isc.org>
Mon, 9 Feb 2026 21:05:46 +0000 (22:05 +0100)
src/hooks/dhcp/radius/client_exchange.cc
src/hooks/dhcp/radius/client_exchange.h
src/hooks/dhcp/radius/radius_request.cc
src/hooks/dhcp/radius/radius_status.cc
src/hooks/dhcp/radius/tests/exchange_unittests.cc

index 1c57e3cafa63f9028f63b86bc0c434fd31c59b94..f9d711e06a78c7e929fc7ead40aa7a2c761340e9 100644 (file)
@@ -82,6 +82,16 @@ Exchange::Exchange(const asiolink::IOServicePtr io_service,
     createIdentifier();
 }
 
+ExchangePtr
+Exchange::create(const asiolink::IOServicePtr io_service,
+                 const MessagePtr& request,
+                 unsigned maxretries,
+                 const Servers& servers,
+                 Handler handler) {
+    return (ExchangePtr(new Exchange(io_service, request, maxretries, servers,
+                                     handler)));
+}
+
 Exchange::Exchange(const MessagePtr& request,
                    unsigned maxretries,
                    const Servers& servers)
@@ -102,6 +112,13 @@ Exchange::Exchange(const MessagePtr& request,
     createIdentifier();
 }
 
+ExchangePtr
+Exchange::create(const MessagePtr& request,
+                   unsigned maxretries,
+                 const Servers& servers) {
+    return (ExchangePtr(new Exchange(request, maxretries, servers)));
+}
+
 Exchange::~Exchange() {
     MultiThreadingLock lock(*mutex_);
     shutdownInternal();
index ef901bed93c8e7e1bbb7b88721ed376b0bf52684..0c1d71173d70c21b38190a8dc88dfbd57f823c64 100644 (file)
@@ -70,7 +70,7 @@ public:
     /// @brief Termination handler.
     typedef std::function<void(const ExchangePtr ex)> Handler;
 
-    /// @brief Constructor.
+    /// @brief Factory.
     ///
     /// Async version.
     ///
@@ -79,22 +79,22 @@ public:
     /// @param maxretries maximum number of retries for a server.
     /// @param servers Servers.
     /// @param handler Termination handler.
-    Exchange(const asiolink::IOServicePtr io_service,
-             const MessagePtr& request,
-             unsigned maxretries,
-             const Servers& servers,
-             Handler handler);
+    static ExchangePtr create(const asiolink::IOServicePtr io_service,
+                              const MessagePtr& request,
+                              unsigned maxretries,
+                              const Servers& servers,
+                              Handler handler);
 
-    /// @brief Constructor.
+    /// @brief Factory.
     ///
     /// Sync version.
     ///
     /// @param request request message to send.
     /// @param maxretries maximum number of retries for a server.
     /// @param servers Servers.
-    Exchange(const MessagePtr& request,
-             unsigned maxretries,
-             const Servers& servers);
+    static ExchangePtr create(const MessagePtr& request,
+                              unsigned maxretries,
+                              const Servers& servers);
 
     /// @brief Destructor.
     virtual ~Exchange();
@@ -137,6 +137,32 @@ public:
     virtual void shutdown();
 
 protected:
+    /// @brief Constructor.
+    ///
+    /// Async version.
+    ///
+    /// @param io_service Reference to the IO service.
+    /// @param request request message to send.
+    /// @param maxretries maximum number of retries for a server.
+    /// @param servers Servers.
+    /// @param handler Termination handler.
+    Exchange(const asiolink::IOServicePtr io_service,
+             const MessagePtr& request,
+             unsigned maxretries,
+             const Servers& servers,
+             Handler handler);
+
+    /// @brief Constructor.
+    ///
+    /// Sync version.
+    ///
+    /// @param request request message to send.
+    /// @param maxretries maximum number of retries for a server.
+    /// @param servers Servers.
+    Exchange(const MessagePtr& request,
+             unsigned maxretries,
+             const Servers& servers);
+
     /// @brief The identifier (random value in hexadecimal).
     std::string identifier_;
 
index 93900a73b7978067101bf2da0d82b7ee631dabd4..8d19a7f3c6cc35657c1d2663a0838f712178bea9 100644 (file)
@@ -59,11 +59,11 @@ RadiusRequest::RadiusRequest(const MsgCode code,
         servers = RadiusImpl::instance().getAccountingServers();
     }
     if (sync) {
-        exchange_.reset(new Exchange(request, maxretries, servers));
+        exchange_ = Exchange::create(request, maxretries, servers);
     } else {
-        exchange_.reset(new Exchange(RadiusImpl::instance().getIOContext(),
+        exchange_ = Exchange::create(RadiusImpl::instance().getIOContext(),
                                      request, maxretries, servers,
-                                     handler));
+                                     handler);
     }
 }
 
index 10396a0623ff651bccf7bee908a3609a110956a7..27933a643035c886384f451e67e2848737284bcb 100644 (file)
@@ -35,10 +35,10 @@ RadiusAuthStatus::RadiusAuthStatus(const AttributesPtr& send_attrs,
                                    "to-be-set", attrs));
     unsigned maxretries = RadiusImpl::instance().retries_;
     Servers servers = RadiusImpl::instance().auth_->servers_;
-    exchange_.reset(new Exchange(RadiusImpl::instance().getIOContext(),
+    exchange_ = Exchange::create(RadiusImpl::instance().getIOContext(),
                                  request, maxretries, servers,
                                  std::bind(&RadiusAuthStatus::invokeCallback,
-                                           handler, ph::_1)));
+                                           handler, ph::_1));
 }
 
 void
@@ -111,10 +111,10 @@ RadiusAcctStatus::RadiusAcctStatus(const AttributesPtr& send_attrs,
                                    "to-be-set", attrs));
     unsigned maxretries = RadiusImpl::instance().retries_;
     Servers servers = RadiusImpl::instance().acct_->servers_;
-    exchange_.reset(new Exchange(RadiusImpl::instance().getIOContext(),
+    exchange_ = Exchange::create(RadiusImpl::instance().getIOContext(),
                                  request, maxretries, servers,
                                  std::bind(&RadiusAcctStatus::invokeCallback,
-                                           handler, ph::_1)));
+                                           handler, ph::_1));
 }
 
 void
@@ -187,10 +187,10 @@ RadiusTlsStatus::RadiusTlsStatus(const AttributesPtr& send_attrs,
                                    "to-be-set", attrs));
     unsigned maxretries = RadiusImpl::instance().retries_;
     Servers servers = RadiusImpl::instance().common_->servers_;
-    exchange_.reset(new Exchange(RadiusImpl::instance().getIOContext(),
+    exchange_ = Exchange::create(RadiusImpl::instance().getIOContext(),
                                  request, maxretries, servers,
                                  std::bind(&RadiusTlsStatus::invokeCallback,
-                                           handler, ph::_1)));
+                                           handler, ph::_1));
 }
 
 void
index fd474a7398677bac96d12d3d646b4b66dad1adc4..b8a5702c35518cbb855b24a6d5f9bdf5abec72ff 100644 (file)
@@ -35,12 +35,14 @@ TEST(TestExchange, async) {
     Servers servers;
 
     // No IO service.
-    EXPECT_THROW_MSG(exchange.reset(new Exchange(io_service, msg, 0, servers, Exchange::Handler())),
+    EXPECT_THROW_MSG(Exchange::create(io_service, msg, 0, servers,
+                                      Exchange::Handler()),
                      BadValue, "null IO service");
 
     // No message.
     io_service.reset(new IOService());
-    EXPECT_THROW_MSG(exchange.reset(new Exchange(io_service, msg, 0, servers, Exchange::Handler())),
+    EXPECT_THROW_MSG(Exchange::create(io_service, msg, 0, servers,
+                                      Exchange::Handler()),
                      BadValue, "null request");
 
     // No servers.
@@ -49,7 +51,8 @@ TEST(TestExchange, async) {
     AttributesPtr attrs;
     string secret = "foobar";
     ASSERT_NO_THROW_LOG(msg.reset(new Message(code, 0, auth, secret, attrs)));
-    EXPECT_THROW_MSG(exchange.reset(new Exchange(io_service, msg, 0, servers, Exchange::Handler())),
+    EXPECT_THROW_MSG(Exchange::create(io_service, msg, 0, servers,
+                                      Exchange::Handler()),
                      BadValue, "no server");
 
     // No handler.
@@ -60,13 +63,14 @@ TEST(TestExchange, async) {
                                                 secret, 0)));
     ASSERT_TRUE(server);
     servers.push_back(server);
-    EXPECT_THROW_MSG(exchange.reset(new Exchange(io_service, msg, 0, servers, Exchange::Handler())),
+    EXPECT_THROW_MSG(Exchange::create(io_service, msg, 0, servers,
+                                      Exchange::Handler()),
                      BadValue, "null handler");
 
     // No error.
     auto handler = [] (const ExchangePtr) { };
-    ASSERT_NO_THROW_LOG(exchange.reset(new Exchange(io_service, msg, 0,
-                                                    servers, handler)));
+    ASSERT_NO_THROW_LOG(exchange = Exchange::create(io_service, msg, 0,
+                                                    servers, handler));
 
     // Check exchange.
     ASSERT_TRUE(exchange);
@@ -89,7 +93,7 @@ TEST(TestExchange, sync) {
     Servers servers;
 
     // No message.
-    EXPECT_THROW_MSG(exchange.reset(new Exchange(msg, 0, servers)), BadValue,
+    EXPECT_THROW_MSG(Exchange::create(msg, 0, servers), BadValue,
                      "null request");
 
     // No servers.
@@ -98,7 +102,7 @@ TEST(TestExchange, sync) {
     AttributesPtr attrs;
     string secret = "foobar";
     ASSERT_NO_THROW_LOG(msg.reset(new Message(code, 0, auth, secret, attrs)));
-    EXPECT_THROW_MSG(exchange.reset(new Exchange(msg, 0, servers)), BadValue,
+    EXPECT_THROW_MSG(Exchange::create(msg, 0, servers), BadValue,
                      "no server");
 
     // No error.
@@ -107,8 +111,9 @@ TEST(TestExchange, sync) {
     TlsContextPtr tls_context;
     ASSERT_NO_THROW_LOG(server.reset(new Server(addr, 11645, addr, tls_context,
                                                 secret, 0)));
+    ASSERT_TRUE(server);
     servers.push_back(server);
-    ASSERT_NO_THROW_LOG(exchange.reset(new Exchange(msg, 0, servers)));
+    ASSERT_NO_THROW_LOG(exchange = Exchange::create(msg, 0, servers));
 
     // Check exchange.
     ASSERT_TRUE(exchange);