diff options
Diffstat (limited to 'http/routing.hpp')
-rw-r--r-- | http/routing.hpp | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/http/routing.hpp b/http/routing.hpp index eb87e72b5d..ead3af9eca 100644 --- a/http/routing.hpp +++ b/http/routing.hpp @@ -8,6 +8,7 @@ #include "http_response.hpp" #include "logging.hpp" #include "privileges.hpp" +#include "server_sent_event.hpp" #include "sessions.hpp" #include "utility.hpp" #include "utils/dbus_utils.hpp" @@ -373,6 +374,72 @@ class WebSocketRule : public BaseRule std::function<void(crow::websocket::Connection&)> errorHandler; }; +class SseSocketRule : public BaseRule +{ + using self_t = SseSocketRule; + + public: + explicit SseSocketRule(const std::string& ruleIn) : BaseRule(ruleIn) {} + + void validate() override {} + + void handle(const Request& /*req*/, + const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, + const std::vector<std::string>& /*params*/) override + { + asyncResp->res.result(boost::beast::http::status::not_found); + } + +#ifndef BMCWEB_ENABLE_SSL + void handleUpgrade(const Request& req, + const std::shared_ptr<bmcweb::AsyncResp>& /*asyncResp*/, + boost::asio::ip::tcp::socket&& adaptor) override + { + std::shared_ptr< + crow::sse_socket::ConnectionImpl<boost::asio::ip::tcp::socket>> + myConnection = std::make_shared< + crow::sse_socket::ConnectionImpl<boost::asio::ip::tcp::socket>>( + req, std::move(adaptor), openHandler, closeHandler); + myConnection->start(); + } +#else + void handleUpgrade(const Request& req, + const std::shared_ptr<bmcweb::AsyncResp>& /*asyncResp*/, + boost::beast::ssl_stream<boost::asio::ip::tcp::socket>&& + adaptor) override + { + std::shared_ptr<crow::sse_socket::ConnectionImpl< + boost::beast::ssl_stream<boost::asio::ip::tcp::socket>>> + myConnection = std::make_shared<crow::sse_socket::ConnectionImpl< + boost::beast::ssl_stream<boost::asio::ip::tcp::socket>>>( + req, std::move(adaptor), openHandler, closeHandler); + myConnection->start(); + } +#endif + + template <typename Func> + self_t& onopen(Func f) + { + openHandler = f; + return *this; + } + + template <typename Func> + self_t& onclose(Func f) + { + closeHandler = f; + return *this; + } + + private: + std::function<void(std::shared_ptr<crow::sse_socket::Connection>&, + const crow::Request&, + const std::shared_ptr<bmcweb::AsyncResp>&)> + openHandler; + std::function<void(std::shared_ptr<crow::sse_socket::Connection>&)> + closeHandler; +}; + template <typename T> struct RuleParameterTraits { @@ -386,6 +453,21 @@ struct RuleParameterTraits return *p; } + SseSocketRule& serverSentEvent() + { + self_t* self = static_cast<self_t*>(this); + SseSocketRule* p = new SseSocketRule(self->rule); + self->ruleToUpgrade.reset(p); + return *p; + } + + self_t& name(std::string_view name) noexcept + { + self_t* self = static_cast<self_t*>(this); + self->nameStr = name; + return *self; + } + self_t& methods(boost::beast::http::verb method) { self_t* self = static_cast<self_t*>(this); @@ -1102,6 +1184,15 @@ class Router return true; } + static bool isSseRoute(Request& req) + { + return std::any_of(sse_socket::sseRoutes.begin(), + sse_socket::sseRoutes.end(), + [&req](const char* sseRoute) { + return (req.url().encoded_path() == sseRoute); + }); + } + static bool isUserPrivileged(Request& req, const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, |