From: Alexander A. Klimov Date: Tue, 2 Apr 2019 15:37:29 +0000 (+0200) Subject: HttpServerConnection: encapsulate streaming start indicator X-Git-Tag: v2.11.0-rc1~162^2~4 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c284cf0b68e167a65aca15f605d438e23bc9be42;p=icinga2 HttpServerConnection: encapsulate streaming start indicator --- diff --git a/lib/remote/actionshandler.cpp b/lib/remote/actionshandler.cpp index 251f8a82e..7b61cd5b9 100644 --- a/lib/remote/actionshandler.cpp +++ b/lib/remote/actionshandler.cpp @@ -20,7 +20,7 @@ bool ActionsHandler::HandleRequest( boost::beast::http::response& response, const Dictionary::Ptr& params, boost::asio::yield_context& yc, - bool& hasStartedStreaming + HttpServerConnection& server ) { namespace http = boost::beast::http; diff --git a/lib/remote/actionshandler.hpp b/lib/remote/actionshandler.hpp index 9c0463035..c2465cf7e 100644 --- a/lib/remote/actionshandler.hpp +++ b/lib/remote/actionshandler.hpp @@ -21,7 +21,7 @@ public: boost::beast::http::response& response, const Dictionary::Ptr& params, boost::asio::yield_context& yc, - bool& hasStartedStreaming + HttpServerConnection& server ) override; }; diff --git a/lib/remote/configfileshandler.cpp b/lib/remote/configfileshandler.cpp index 05def8655..d4c761c7b 100644 --- a/lib/remote/configfileshandler.cpp +++ b/lib/remote/configfileshandler.cpp @@ -20,7 +20,7 @@ bool ConfigFilesHandler::HandleRequest( boost::beast::http::response& response, const Dictionary::Ptr& params, boost::asio::yield_context& yc, - bool& hasStartedStreaming + HttpServerConnection& server ) { namespace http = boost::beast::http; diff --git a/lib/remote/configfileshandler.hpp b/lib/remote/configfileshandler.hpp index 1384c2b58..ea48b1ef4 100644 --- a/lib/remote/configfileshandler.hpp +++ b/lib/remote/configfileshandler.hpp @@ -21,7 +21,7 @@ public: boost::beast::http::response& response, const Dictionary::Ptr& params, boost::asio::yield_context& yc, - bool& hasStartedStreaming + HttpServerConnection& server ) override; }; diff --git a/lib/remote/configpackageshandler.cpp b/lib/remote/configpackageshandler.cpp index 2505de36a..d9cd9ec9b 100644 --- a/lib/remote/configpackageshandler.cpp +++ b/lib/remote/configpackageshandler.cpp @@ -18,7 +18,7 @@ bool ConfigPackagesHandler::HandleRequest( boost::beast::http::response& response, const Dictionary::Ptr& params, boost::asio::yield_context& yc, - bool& hasStartedStreaming + HttpServerConnection& server ) { namespace http = boost::beast::http; diff --git a/lib/remote/configpackageshandler.hpp b/lib/remote/configpackageshandler.hpp index 2ae184c6a..0a05ea10a 100644 --- a/lib/remote/configpackageshandler.hpp +++ b/lib/remote/configpackageshandler.hpp @@ -21,7 +21,7 @@ public: boost::beast::http::response& response, const Dictionary::Ptr& params, boost::asio::yield_context& yc, - bool& hasStartedStreaming + HttpServerConnection& server ) override; private: diff --git a/lib/remote/configstageshandler.cpp b/lib/remote/configstageshandler.cpp index 067181f27..a3c570a2f 100644 --- a/lib/remote/configstageshandler.cpp +++ b/lib/remote/configstageshandler.cpp @@ -19,7 +19,7 @@ bool ConfigStagesHandler::HandleRequest( boost::beast::http::response& response, const Dictionary::Ptr& params, boost::asio::yield_context& yc, - bool& hasStartedStreaming + HttpServerConnection& server ) { namespace http = boost::beast::http; diff --git a/lib/remote/configstageshandler.hpp b/lib/remote/configstageshandler.hpp index 4ee35ad91..c6d644366 100644 --- a/lib/remote/configstageshandler.hpp +++ b/lib/remote/configstageshandler.hpp @@ -21,7 +21,7 @@ public: boost::beast::http::response& response, const Dictionary::Ptr& params, boost::asio::yield_context& yc, - bool& hasStartedStreaming + HttpServerConnection& server ) override; private: diff --git a/lib/remote/consolehandler.cpp b/lib/remote/consolehandler.cpp index 430a37cf3..0f0fddc8f 100644 --- a/lib/remote/consolehandler.cpp +++ b/lib/remote/consolehandler.cpp @@ -61,7 +61,7 @@ bool ConsoleHandler::HandleRequest( boost::beast::http::response& response, const Dictionary::Ptr& params, boost::asio::yield_context& yc, - bool& hasStartedStreaming + HttpServerConnection& server ) { namespace http = boost::beast::http; diff --git a/lib/remote/consolehandler.hpp b/lib/remote/consolehandler.hpp index 339f3ed86..df0d77d01 100644 --- a/lib/remote/consolehandler.hpp +++ b/lib/remote/consolehandler.hpp @@ -30,7 +30,7 @@ public: boost::beast::http::response& response, const Dictionary::Ptr& params, boost::asio::yield_context& yc, - bool& hasStartedStreaming + HttpServerConnection& server ) override; static std::vector GetAutocompletionSuggestions(const String& word, ScriptFrame& frame); diff --git a/lib/remote/createobjecthandler.cpp b/lib/remote/createobjecthandler.cpp index 1f7ab6710..c01b23641 100644 --- a/lib/remote/createobjecthandler.cpp +++ b/lib/remote/createobjecthandler.cpp @@ -22,7 +22,7 @@ bool CreateObjectHandler::HandleRequest( boost::beast::http::response& response, const Dictionary::Ptr& params, boost::asio::yield_context& yc, - bool& hasStartedStreaming + HttpServerConnection& server ) { namespace http = boost::beast::http; diff --git a/lib/remote/createobjecthandler.hpp b/lib/remote/createobjecthandler.hpp index ff42a62e6..4bcf21b55 100644 --- a/lib/remote/createobjecthandler.hpp +++ b/lib/remote/createobjecthandler.hpp @@ -21,7 +21,7 @@ public: boost::beast::http::response& response, const Dictionary::Ptr& params, boost::asio::yield_context& yc, - bool& hasStartedStreaming + HttpServerConnection& server ) override; }; diff --git a/lib/remote/deleteobjecthandler.cpp b/lib/remote/deleteobjecthandler.cpp index 15951588e..2edb0e455 100644 --- a/lib/remote/deleteobjecthandler.cpp +++ b/lib/remote/deleteobjecthandler.cpp @@ -22,7 +22,7 @@ bool DeleteObjectHandler::HandleRequest( boost::beast::http::response& response, const Dictionary::Ptr& params, boost::asio::yield_context& yc, - bool& hasStartedStreaming + HttpServerConnection& server ) { namespace http = boost::beast::http; diff --git a/lib/remote/deleteobjecthandler.hpp b/lib/remote/deleteobjecthandler.hpp index 3ecb0c71b..19a46e475 100644 --- a/lib/remote/deleteobjecthandler.hpp +++ b/lib/remote/deleteobjecthandler.hpp @@ -21,7 +21,7 @@ public: boost::beast::http::response& response, const Dictionary::Ptr& params, boost::asio::yield_context& yc, - bool& hasStartedStreaming + HttpServerConnection& server ) override; }; diff --git a/lib/remote/eventshandler.cpp b/lib/remote/eventshandler.cpp index e6f895cf3..20f655f86 100644 --- a/lib/remote/eventshandler.cpp +++ b/lib/remote/eventshandler.cpp @@ -25,7 +25,7 @@ bool EventsHandler::HandleRequest( boost::beast::http::response& response, const Dictionary::Ptr& params, boost::asio::yield_context& yc, - bool& hasStartedStreaming + HttpServerConnection& server ) { namespace asio = boost::asio; @@ -88,7 +88,7 @@ bool EventsHandler::HandleRequest( EventQueue::UnregisterIfUnused(queueName, queue); }); - hasStartedStreaming = true; + server.StartStreaming(); response.result(http::status::ok); response.set(http::field::content_type, "application/json"); diff --git a/lib/remote/eventshandler.hpp b/lib/remote/eventshandler.hpp index cffeea503..c823415d3 100644 --- a/lib/remote/eventshandler.hpp +++ b/lib/remote/eventshandler.hpp @@ -22,7 +22,7 @@ public: boost::beast::http::response& response, const Dictionary::Ptr& params, boost::asio::yield_context& yc, - bool& hasStartedStreaming + HttpServerConnection& server ) override; }; diff --git a/lib/remote/httphandler.cpp b/lib/remote/httphandler.cpp index c089c00ea..78e09d2ad 100644 --- a/lib/remote/httphandler.cpp +++ b/lib/remote/httphandler.cpp @@ -51,7 +51,7 @@ void HttpHandler::ProcessRequest( boost::beast::http::request& request, boost::beast::http::response& response, boost::asio::yield_context& yc, - bool& hasStartedStreaming + HttpServerConnection& server ) { Dictionary::Ptr node = m_UrlTree; @@ -99,7 +99,7 @@ void HttpHandler::ProcessRequest( bool processed = false; for (const HttpHandler::Ptr& handler : handlers) { - if (handler->HandleRequest(stream, user, request, url, response, params, yc, hasStartedStreaming)) { + if (handler->HandleRequest(stream, user, request, url, response, params, yc, server)) { processed = true; break; } diff --git a/lib/remote/httphandler.hpp b/lib/remote/httphandler.hpp index cec5f58cd..6c10d0aff 100644 --- a/lib/remote/httphandler.hpp +++ b/lib/remote/httphandler.hpp @@ -6,6 +6,7 @@ #include "remote/i2-remote.hpp" #include "remote/url.hpp" #include "remote/httpresponse.hpp" +#include "remote/httpserverconnection.hpp" #include "remote/apiuser.hpp" #include "base/registry.hpp" #include "base/tlsstream.hpp" @@ -34,7 +35,7 @@ public: boost::beast::http::response& response, const Dictionary::Ptr& params, boost::asio::yield_context& yc, - bool& hasStartedStreaming + HttpServerConnection& server ) = 0; static void Register(const Url::Ptr& url, const HttpHandler::Ptr& handler); @@ -44,7 +45,7 @@ public: boost::beast::http::request& request, boost::beast::http::response& response, boost::asio::yield_context& yc, - bool& hasStartedStreaming + HttpServerConnection& server ); private: diff --git a/lib/remote/httpserverconnection.cpp b/lib/remote/httpserverconnection.cpp index af5169952..5c40e2e83 100644 --- a/lib/remote/httpserverconnection.cpp +++ b/lib/remote/httpserverconnection.cpp @@ -31,7 +31,7 @@ using namespace icinga; auto const l_ServerHeader ("Icinga/" + Application::GetAppVersion()); HttpServerConnection::HttpServerConnection(const String& identity, bool authenticated, const std::shared_ptr& stream) - : m_Stream(stream), m_Seen(Utility::GetTime()), m_IoStrand(stream->get_io_service()), m_ShuttingDown(false) + : m_Stream(stream), m_Seen(Utility::GetTime()), m_IoStrand(stream->get_io_service()), m_ShuttingDown(false), m_HasStartedStreaming(false) { if (authenticated) { m_ApiUser = ApiUser::GetByClientCN(identity); @@ -91,6 +91,11 @@ void HttpServerConnection::Disconnect() }); } +void HttpServerConnection::StartStreaming() +{ + m_HasStartedStreaming = true; +} + static inline bool EnsureValidHeaders( AsioTlsStream& stream, @@ -375,17 +380,17 @@ bool ProcessRequest( boost::beast::http::request& request, ApiUser::Ptr& authenticatedUser, boost::beast::http::response& response, + HttpServerConnection& server, + bool& hasStartedStreaming, boost::asio::yield_context& yc ) { namespace http = boost::beast::http; - bool hasStartedStreaming = false; - try { CpuBoundWork handlingRequest (yc); - HttpHandler::ProcessRequest(stream, authenticatedUser, request, response, yc, hasStartedStreaming); + HttpHandler::ProcessRequest(stream, authenticatedUser, request, response, yc, server); } catch (const std::exception& ex) { if (hasStartedStreaming) { return false; @@ -481,7 +486,7 @@ void HttpServerConnection::ProcessMessages(boost::asio::yield_context yc) m_Seen = std::numeric_limits::max(); - if (!ProcessRequest(*m_Stream, request, authenticatedUser, response, yc)) { + if (!ProcessRequest(*m_Stream, request, authenticatedUser, response, *this, m_HasStartedStreaming, yc)) { break; } diff --git a/lib/remote/httpserverconnection.hpp b/lib/remote/httpserverconnection.hpp index 7db97ed68..56876829c 100644 --- a/lib/remote/httpserverconnection.hpp +++ b/lib/remote/httpserverconnection.hpp @@ -27,6 +27,7 @@ public: void Start(); void Disconnect(); + void StartStreaming(); private: ApiUser::Ptr m_ApiUser; @@ -35,6 +36,7 @@ private: String m_PeerAddress; boost::asio::io_service::strand m_IoStrand; bool m_ShuttingDown; + bool m_HasStartedStreaming; void ProcessMessages(boost::asio::yield_context yc); void CheckLiveness(boost::asio::yield_context yc); diff --git a/lib/remote/infohandler.cpp b/lib/remote/infohandler.cpp index 38f99781d..d9d6b45cb 100644 --- a/lib/remote/infohandler.cpp +++ b/lib/remote/infohandler.cpp @@ -16,7 +16,7 @@ bool InfoHandler::HandleRequest( boost::beast::http::response& response, const Dictionary::Ptr& params, boost::asio::yield_context& yc, - bool& hasStartedStreaming + HttpServerConnection& server ) { namespace http = boost::beast::http; diff --git a/lib/remote/infohandler.hpp b/lib/remote/infohandler.hpp index 346340d81..e1fe98314 100644 --- a/lib/remote/infohandler.hpp +++ b/lib/remote/infohandler.hpp @@ -21,7 +21,7 @@ public: boost::beast::http::response& response, const Dictionary::Ptr& params, boost::asio::yield_context& yc, - bool& hasStartedStreaming + HttpServerConnection& server ) override; }; diff --git a/lib/remote/modifyobjecthandler.cpp b/lib/remote/modifyobjecthandler.cpp index 2150903a1..3f360fe30 100644 --- a/lib/remote/modifyobjecthandler.cpp +++ b/lib/remote/modifyobjecthandler.cpp @@ -20,7 +20,7 @@ bool ModifyObjectHandler::HandleRequest( boost::beast::http::response& response, const Dictionary::Ptr& params, boost::asio::yield_context& yc, - bool& hasStartedStreaming + HttpServerConnection& server ) { namespace http = boost::beast::http; diff --git a/lib/remote/modifyobjecthandler.hpp b/lib/remote/modifyobjecthandler.hpp index c9bb21612..f4693013f 100644 --- a/lib/remote/modifyobjecthandler.hpp +++ b/lib/remote/modifyobjecthandler.hpp @@ -21,7 +21,7 @@ public: boost::beast::http::response& response, const Dictionary::Ptr& params, boost::asio::yield_context& yc, - bool& hasStartedStreaming + HttpServerConnection& server ) override; }; diff --git a/lib/remote/objectqueryhandler.cpp b/lib/remote/objectqueryhandler.cpp index 2d9b79845..3f827037c 100644 --- a/lib/remote/objectqueryhandler.cpp +++ b/lib/remote/objectqueryhandler.cpp @@ -95,7 +95,7 @@ bool ObjectQueryHandler::HandleRequest( boost::beast::http::response& response, const Dictionary::Ptr& params, boost::asio::yield_context& yc, - bool& hasStartedStreaming + HttpServerConnection& server ) { namespace http = boost::beast::http; diff --git a/lib/remote/objectqueryhandler.hpp b/lib/remote/objectqueryhandler.hpp index c35ff4066..691b2cfcf 100644 --- a/lib/remote/objectqueryhandler.hpp +++ b/lib/remote/objectqueryhandler.hpp @@ -21,7 +21,7 @@ public: boost::beast::http::response& response, const Dictionary::Ptr& params, boost::asio::yield_context& yc, - bool& hasStartedStreaming + HttpServerConnection& server ) override; private: diff --git a/lib/remote/statushandler.cpp b/lib/remote/statushandler.cpp index cc725e4f4..1f3f61899 100644 --- a/lib/remote/statushandler.cpp +++ b/lib/remote/statushandler.cpp @@ -76,7 +76,7 @@ bool StatusHandler::HandleRequest( boost::beast::http::response& response, const Dictionary::Ptr& params, boost::asio::yield_context& yc, - bool& hasStartedStreaming + HttpServerConnection& server ) { namespace http = boost::beast::http; diff --git a/lib/remote/statushandler.hpp b/lib/remote/statushandler.hpp index 36f5efcf1..c722ab3e2 100644 --- a/lib/remote/statushandler.hpp +++ b/lib/remote/statushandler.hpp @@ -21,7 +21,7 @@ public: boost::beast::http::response& response, const Dictionary::Ptr& params, boost::asio::yield_context& yc, - bool& hasStartedStreaming + HttpServerConnection& server ) override; }; diff --git a/lib/remote/templatequeryhandler.cpp b/lib/remote/templatequeryhandler.cpp index 38a225540..e70dafb65 100644 --- a/lib/remote/templatequeryhandler.cpp +++ b/lib/remote/templatequeryhandler.cpp @@ -83,7 +83,7 @@ bool TemplateQueryHandler::HandleRequest( boost::beast::http::response& response, const Dictionary::Ptr& params, boost::asio::yield_context& yc, - bool& hasStartedStreaming + HttpServerConnection& server ) { namespace http = boost::beast::http; diff --git a/lib/remote/templatequeryhandler.hpp b/lib/remote/templatequeryhandler.hpp index e9dec8896..503bc8560 100644 --- a/lib/remote/templatequeryhandler.hpp +++ b/lib/remote/templatequeryhandler.hpp @@ -21,7 +21,7 @@ public: boost::beast::http::response& response, const Dictionary::Ptr& params, boost::asio::yield_context& yc, - bool& hasStartedStreaming + HttpServerConnection& server ) override; }; diff --git a/lib/remote/typequeryhandler.cpp b/lib/remote/typequeryhandler.cpp index 077113774..4e8265398 100644 --- a/lib/remote/typequeryhandler.cpp +++ b/lib/remote/typequeryhandler.cpp @@ -54,7 +54,7 @@ bool TypeQueryHandler::HandleRequest( boost::beast::http::response& response, const Dictionary::Ptr& params, boost::asio::yield_context& yc, - bool& hasStartedStreaming + HttpServerConnection& server ) { namespace http = boost::beast::http; diff --git a/lib/remote/typequeryhandler.hpp b/lib/remote/typequeryhandler.hpp index 84c04185d..5489cb232 100644 --- a/lib/remote/typequeryhandler.hpp +++ b/lib/remote/typequeryhandler.hpp @@ -21,7 +21,7 @@ public: boost::beast::http::response& response, const Dictionary::Ptr& params, boost::asio::yield_context& yc, - bool& hasStartedStreaming + HttpServerConnection& server ) override; }; diff --git a/lib/remote/variablequeryhandler.cpp b/lib/remote/variablequeryhandler.cpp index 05b503783..aef896e6f 100644 --- a/lib/remote/variablequeryhandler.cpp +++ b/lib/remote/variablequeryhandler.cpp @@ -64,7 +64,7 @@ bool VariableQueryHandler::HandleRequest( boost::beast::http::response& response, const Dictionary::Ptr& params, boost::asio::yield_context& yc, - bool& hasStartedStreaming + HttpServerConnection& server ) { namespace http = boost::beast::http; diff --git a/lib/remote/variablequeryhandler.hpp b/lib/remote/variablequeryhandler.hpp index ecc71a96a..48e73be35 100644 --- a/lib/remote/variablequeryhandler.hpp +++ b/lib/remote/variablequeryhandler.hpp @@ -21,7 +21,7 @@ public: boost::beast::http::response& response, const Dictionary::Ptr& params, boost::asio::yield_context& yc, - bool& hasStartedStreaming + HttpServerConnection& server ) override; };