auto const l_ServerHeader ("Icinga/" + Application::GetAppVersion());
HttpServerConnection::HttpServerConnection(const String& identity, bool authenticated, const std::shared_ptr<AsioTlsStream>& stream)
- : m_Stream(stream), m_Seen(Utility::GetTime()), m_IoStrand(stream->get_executor().context()), m_ShuttingDown(false), m_HasStartedStreaming(false)
+ : m_Stream(stream), m_Seen(Utility::GetTime()), m_IoStrand(stream->get_executor().context()), m_ShuttingDown(false), m_HasStartedStreaming(false),
+ m_CheckLivenessTimer(stream->get_executor().context())
{
if (authenticated) {
m_ApiUser = ApiUser::GetByClientCN(identity);
} catch (...) {
}
+ try {
+ m_Stream->lowest_layer().cancel();
+ } catch (...) {
+ }
+
+ m_CheckLivenessTimer.cancel();
+
auto listener (ApiListener::GetInstance());
if (listener) {
void HttpServerConnection::CheckLiveness(boost::asio::yield_context yc)
{
- boost::asio::deadline_timer timer (m_Stream->get_executor().context());
+ boost::system::error_code ec;
for (;;) {
- timer.expires_from_now(boost::posix_time::seconds(5));
- timer.async_wait(yc);
+ m_CheckLivenessTimer.expires_from_now(boost::posix_time::seconds(5));
+ m_CheckLivenessTimer.async_wait(yc[ec]);
if (m_ShuttingDown) {
break;
#include "base/string.hpp"
#include "base/tlsstream.hpp"
#include <memory>
+#include <boost/asio/deadline_timer.hpp>
#include <boost/asio/io_service_strand.hpp>
#include <boost/asio/spawn.hpp>
boost::asio::io_service::strand m_IoStrand;
bool m_ShuttingDown;
bool m_HasStartedStreaming;
+ boost::asio::deadline_timer m_CheckLivenessTimer;
void ProcessMessages(boost::asio::yield_context yc);
void CheckLiveness(boost::asio::yield_context yc);
#include "base/configtype.hpp"
#include "base/logger.hpp"
#include "base/utility.hpp"
-#include <boost/asio/deadline_timer.hpp>
#include <boost/asio/spawn.hpp>
#include <boost/date_time/posix_time/posix_time_duration.hpp>
+#include <boost/system/system_error.hpp>
using namespace icinga;
void JsonRpcConnection::HandleAndWriteHeartbeats(boost::asio::yield_context yc)
{
- boost::asio::deadline_timer timer (m_Stream->get_executor().context());
+ boost::system::error_code ec;
for (;;) {
- timer.expires_from_now(boost::posix_time::seconds(10));
- timer.async_wait(yc);
+ m_HeartbeatTimer.expires_from_now(boost::posix_time::seconds(10));
+ m_HeartbeatTimer.async_wait(yc[ec]);
if (m_ShuttingDown) {
break;
#include "base/tlsstream.hpp"
#include <memory>
#include <utility>
-#include <boost/asio/deadline_timer.hpp>
#include <boost/asio/spawn.hpp>
#include <boost/date_time/posix_time/posix_time_duration.hpp>
+#include <boost/system/system_error.hpp>
#include <boost/thread/once.hpp>
using namespace icinga;
const std::shared_ptr<AsioTlsStream>& stream, ConnectionRole role)
: m_Identity(identity), m_Authenticated(authenticated), m_Stream(stream),
m_Role(role), m_Timestamp(Utility::GetTime()), m_Seen(Utility::GetTime()), m_NextHeartbeat(0), m_IoStrand(stream->get_executor().context()),
- m_OutgoingMessagesQueued(stream->get_executor().context()), m_WriterDone(stream->get_executor().context()), m_ShuttingDown(false)
+ m_OutgoingMessagesQueued(stream->get_executor().context()), m_WriterDone(stream->get_executor().context()), m_ShuttingDown(false),
+ m_CheckLivenessTimer(stream->get_executor().context()), m_HeartbeatTimer(stream->get_executor().context())
{
if (authenticated)
m_Endpoint = Endpoint::GetByName(identity);
} catch (...) {
}
+ try {
+ m_Stream->lowest_layer().cancel();
+ } catch (...) {
+ }
+
+ m_CheckLivenessTimer.cancel();
+ m_HeartbeatTimer.cancel();
+
CpuBoundWork removeClient (yc);
if (m_Endpoint) {
void JsonRpcConnection::CheckLiveness(boost::asio::yield_context yc)
{
- boost::asio::deadline_timer timer (m_Stream->get_executor().context());
+ boost::system::error_code ec;
for (;;) {
- timer.expires_from_now(boost::posix_time::seconds(30));
- timer.async_wait(yc);
+ m_CheckLivenessTimer.expires_from_now(boost::posix_time::seconds(30));
+ m_CheckLivenessTimer.async_wait(yc[ec]);
if (m_ShuttingDown) {
break;
#include "base/workqueue.hpp"
#include <memory>
#include <vector>
+#include <boost/asio/deadline_timer.hpp>
#include <boost/asio/io_service_strand.hpp>
#include <boost/asio/spawn.hpp>
AsioConditionVariable m_OutgoingMessagesQueued;
AsioConditionVariable m_WriterDone;
bool m_ShuttingDown;
+ boost::asio::deadline_timer m_CheckLivenessTimer, m_HeartbeatTimer;
void HandleIncomingMessages(boost::asio::yield_context yc);
void WriteOutgoingMessages(boost::asio::yield_context yc);