From 2e7767d192a2634b790199b5f70909ae8a57ed8e Mon Sep 17 00:00:00 2001
From: Seva <seva@binarytrails.net>
Date: Mon, 3 Jun 2019 13:52:35 -0400
Subject: [PATCH] dhtproxy: fix restinio start w/o dhtlogger

---
 include/opendht/dht_proxy_server.h | 25 +++++++++++++++----------
 include/opendht/dhtrunner.h        |  2 +-
 src/dht_proxy_server.cpp           |  4 ++--
 tools/dhtnode.cpp                  |  4 +++-
 4 files changed, 21 insertions(+), 14 deletions(-)

diff --git a/include/opendht/dht_proxy_server.h b/include/opendht/dht_proxy_server.h
index 1614fca7..c462a34c 100644
--- a/include/opendht/dht_proxy_server.h
+++ b/include/opendht/dht_proxy_server.h
@@ -41,38 +41,43 @@
 class opendht_logger_t
 {
     public:
-        opendht_logger_t(const dht::Logger &logger):
-            m_logger(logger)
-        {}
+        opendht_logger_t(std::shared_ptr<dht::Logger> logger = nullptr){
+            if (logger)
+                m_logger = logger;
+        }
 
         template <typename Builder>
         void trace(Builder && msg_builder){
-            m_logger.d("[restinio] %s", msg_builder().c_str());
+            if (m_logger)
+                m_logger->d("[restinio] %s", msg_builder().c_str());
         }
 
         template <typename Builder>
         void info(Builder && msg_builder){
-            m_logger.d("[restinio] %s", msg_builder().c_str());
+            if (m_logger)
+                m_logger->d("[restinio] %s", msg_builder().c_str());
         }
 
         template <typename Builder>
         void warn(Builder && msg_builder){
-            m_logger.w("[restinio] %s", msg_builder().c_str());
+            if (m_logger)
+                m_logger->w("[restinio] %s", msg_builder().c_str());
         }
 
         template <typename Builder>
         void error(Builder && msg_builder){
-            m_logger.e("[restinio] %s", msg_builder().c_str());
+            if (m_logger)
+                m_logger->e("[restinio] %s", msg_builder().c_str());
         }
 
     private:
-        dht::Logger m_logger;
+        std::shared_ptr<dht::Logger> m_logger;
 };
 
 using RestRouter = restinio::router::express_router_t<>;
 using RestRouterTraits = restinio::traits_t<
     restinio::asio_timer_manager_t,
-    opendht_logger_t, //restinio::single_threaded_ostream_logger_t,
+    opendht_logger_t,
     RestRouter>;
 using RequestStatus = restinio::request_handling_status_t;
 using ResponseByParts = restinio::chunked_output_t;
@@ -101,7 +106,7 @@ public:
      * @note if the server fails to start (if port is already used or reserved),
      * it will fails silently
      */
-    DhtProxyServer(std::shared_ptr<DhtRunner> dht, in_port_t port = 8000, const std::string& pushServer = "", const Logger& logger = {});
+    DhtProxyServer(std::shared_ptr<DhtRunner> dht, in_port_t port = 8000, const std::string& pushServer = "", std::shared_ptr<dht::Logger> logger = nullptr);
     virtual ~DhtProxyServer();
 
     DhtProxyServer(const DhtProxyServer& other) = delete;
diff --git a/include/opendht/dhtrunner.h b/include/opendht/dhtrunner.h
index 84795263..04eeb750 100644
--- a/include/opendht/dhtrunner.h
+++ b/include/opendht/dhtrunner.h
@@ -64,7 +64,7 @@ public:
     };
 
     struct Context {
-        std::unique_ptr<Logger> logger {};
+        std::shared_ptr<Logger> logger {};
         std::shared_ptr<PeerDiscovery> peerDiscovery {};
         Context() {}
     };
diff --git a/src/dht_proxy_server.cpp b/src/dht_proxy_server.cpp
index d04675e2..7696584a 100644
--- a/src/dht_proxy_server.cpp
+++ b/src/dht_proxy_server.cpp
@@ -51,7 +51,7 @@ constexpr const std::chrono::minutes PRINT_STATS_PERIOD {2};
 constexpr const size_t IO_THREADS_MAX {64};
 
 
-DhtProxyServer::DhtProxyServer(std::shared_ptr<DhtRunner> dht, in_port_t port , const std::string& pushServer, const Logger &logger)
+DhtProxyServer::DhtProxyServer(std::shared_ptr<DhtRunner> dht, in_port_t port , const std::string& pushServer, std::shared_ptr<dht::Logger> logger)
 :  dht_(dht), threadPool_(new ThreadPool(IO_THREADS_MAX)), pushServer_(pushServer)
 {
     if (not dht_)
@@ -69,7 +69,7 @@ DhtProxyServer::DhtProxyServer(std::shared_ptr<DhtRunner> dht, in_port_t port ,
     jsonBuilder_["commentStyle"] = "None";
     jsonBuilder_["indentation"] = "";
 
-    server_thread = std::thread([this, port, &logger](){
+    server_thread = std::thread([this, port, logger](){
         using namespace std::chrono;
         auto maxThreads = std::thread::hardware_concurrency() - 1;
         auto restThreads = maxThreads > 1 ? maxThreads : 1;
diff --git a/tools/dhtnode.cpp b/tools/dhtnode.cpp
index e70473a1..68d87057 100644
--- a/tools/dhtnode.cpp
+++ b/tools/dhtnode.cpp
@@ -537,6 +537,8 @@ main(int argc, char **argv)
                 context.logger = log::getFileLogger(params.logfile);
             else
                 context.logger = log::getStdLogger();
+        } else {
+            context.logger = nullptr;
         }
 
         node->run(params.port, config, std::move(context));
@@ -551,7 +553,7 @@ main(int argc, char **argv)
 #endif
         if (params.proxyserver != 0) {
 #ifdef OPENDHT_PROXY_SERVER
-            proxies.emplace(params.proxyserver, std::unique_ptr<DhtProxyServer>(new DhtProxyServer(node, params.proxyserver, params.pushserver, *context.logger)));
+            proxies.emplace(params.proxyserver, std::unique_ptr<DhtProxyServer>(new DhtProxyServer(node, params.proxyserver, params.pushserver, context.logger)));
 #else
             std::cerr << "DHT proxy server requested but OpenDHT built without proxy server support." << std::endl;
             exit(EXIT_FAILURE);
-- 
GitLab