]> granicus.if.org Git - icinga2/commitdiff
Close client connections if we haven't received any messages in some time
authorGunnar Beutner <gunnar@beutner.name>
Thu, 26 Feb 2015 11:41:47 +0000 (12:41 +0100)
committerGunnar Beutner <gunnar@beutner.name>
Thu, 26 Feb 2015 11:41:47 +0000 (12:41 +0100)
refs #8485

lib/remote/apiclient.cpp
lib/remote/apiclient.hpp

index 2304df3fba66c94b2646577eb15221ceba80f716..d34eaadf0f80f3cf16a2c5fd98cb68e9a889b90f 100644 (file)
@@ -45,6 +45,11 @@ ApiClient::ApiClient(const String& identity, bool authenticated, const TlsStream
 void ApiClient::Start(void)
 {
        m_Stream->RegisterDataHandler(boost::bind(&ApiClient::DataAvailableHandler, this));
+
+       m_TimeoutTimer = new Timer();
+       m_TimeoutTimer->OnTimerExpired.connect(boost::bind(&ApiClient::TimeoutTimerHandler, this));
+       m_TimeoutTimer->SetInterval(15);
+       m_TimeoutTimer->Start();
 }
 
 String ApiClient::GetIdentity(void) const
@@ -84,8 +89,6 @@ void ApiClient::SendMessageSync(const Dictionary::Ptr& message)
                if (m_Stream->IsEof())
                        return;
                JsonRpc::SendMessage(m_Stream, message);
-               if (message->Get("method") != "log::SetLogPosition")
-                       m_Seen = Utility::GetTime();
        } catch (const std::exception& ex) {
                std::ostringstream info;
                info << "Error while sending JSON-RPC message for identity '" << m_Identity << "'";
@@ -128,8 +131,7 @@ bool ApiClient::ProcessMessage(void)
        if (srs != StatusNewItem)
                return false;
 
-       if (message->Get("method") != "log::SetLogPosition")
-               m_Seen = Utility::GetTime();
+       m_Seen = Utility::GetTime();
 
        if (m_Endpoint && message->Contains("ts")) {
                double ts = message->Get("ts");
@@ -254,3 +256,9 @@ Value RequestCertificateHandler(const MessageOrigin& origin, const Dictionary::P
 
        return result;
 }
+
+void ApiClient::TimeoutTimerHandler(void)
+{
+       if (Utility::GetTime() - 60 > m_Seen)
+               Disconnect();
+}
index de0b3eee59945d9686044d96af04f38c3064b2f3..ea015f37558fc0d88581c3a05f8738a6c18ee9a0 100644 (file)
@@ -72,6 +72,7 @@ private:
        ConnectionRole m_Role;
        double m_Seen;
        double m_NextHeartbeat;
+       Timer::Ptr m_TimeoutTimer;
 
        StreamReadContext m_Context;
 
@@ -80,6 +81,8 @@ private:
        bool ProcessMessage(void);
        void DataAvailableHandler(void);
        void SendMessageSync(const Dictionary::Ptr& request);
+
+       void TimeoutTimerHandler(void);
 };
 
 }