108bbe119SEd Tanous #pragma once 208bbe119SEd Tanous 308bbe119SEd Tanous #include "baserule.hpp" 408bbe119SEd Tanous #include "http_request.hpp" 508bbe119SEd Tanous #include "http_response.hpp" 608bbe119SEd Tanous #include "server_sent_event.hpp" 708bbe119SEd Tanous 808bbe119SEd Tanous #include <boost/beast/http/verb.hpp> 908bbe119SEd Tanous 1008bbe119SEd Tanous #include <functional> 1108bbe119SEd Tanous #include <memory> 1208bbe119SEd Tanous #include <string> 1308bbe119SEd Tanous 1408bbe119SEd Tanous namespace crow 1508bbe119SEd Tanous { 1608bbe119SEd Tanous 1708bbe119SEd Tanous class SseSocketRule : public BaseRule 1808bbe119SEd Tanous { 1908bbe119SEd Tanous using self_t = SseSocketRule; 2008bbe119SEd Tanous 2108bbe119SEd Tanous public: 2208bbe119SEd Tanous explicit SseSocketRule(const std::string& ruleIn) : BaseRule(ruleIn) {} 2308bbe119SEd Tanous 2408bbe119SEd Tanous void validate() override {} 2508bbe119SEd Tanous 2608bbe119SEd Tanous void handle(const Request& /*req*/, 2708bbe119SEd Tanous const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, 2808bbe119SEd Tanous const std::vector<std::string>& /*params*/) override 2908bbe119SEd Tanous { 3008bbe119SEd Tanous asyncResp->res.result(boost::beast::http::status::not_found); 3108bbe119SEd Tanous } 3208bbe119SEd Tanous 3308bbe119SEd Tanous #ifndef BMCWEB_ENABLE_SSL 34*93cf0ac2SEd Tanous void handleUpgrade(const Request& /*req*/, 3508bbe119SEd Tanous const std::shared_ptr<bmcweb::AsyncResp>& /*asyncResp*/, 3608bbe119SEd Tanous boost::asio::ip::tcp::socket&& adaptor) override 3708bbe119SEd Tanous { 3808bbe119SEd Tanous std::shared_ptr< 3908bbe119SEd Tanous crow::sse_socket::ConnectionImpl<boost::asio::ip::tcp::socket>> 4008bbe119SEd Tanous myConnection = std::make_shared< 4108bbe119SEd Tanous crow::sse_socket::ConnectionImpl<boost::asio::ip::tcp::socket>>( 42*93cf0ac2SEd Tanous std::move(adaptor), openHandler, closeHandler); 4308bbe119SEd Tanous myConnection->start(); 4408bbe119SEd Tanous } 4508bbe119SEd Tanous #else 46*93cf0ac2SEd Tanous void handleUpgrade(const Request& /*req*/, 4708bbe119SEd Tanous const std::shared_ptr<bmcweb::AsyncResp>& /*asyncResp*/, 4808bbe119SEd Tanous boost::beast::ssl_stream<boost::asio::ip::tcp::socket>&& 4908bbe119SEd Tanous adaptor) override 5008bbe119SEd Tanous { 5108bbe119SEd Tanous std::shared_ptr<crow::sse_socket::ConnectionImpl< 5208bbe119SEd Tanous boost::beast::ssl_stream<boost::asio::ip::tcp::socket>>> 5308bbe119SEd Tanous myConnection = std::make_shared<crow::sse_socket::ConnectionImpl< 5408bbe119SEd Tanous boost::beast::ssl_stream<boost::asio::ip::tcp::socket>>>( 55*93cf0ac2SEd Tanous std::move(adaptor), openHandler, closeHandler); 5608bbe119SEd Tanous myConnection->start(); 5708bbe119SEd Tanous } 5808bbe119SEd Tanous #endif 5908bbe119SEd Tanous 6008bbe119SEd Tanous template <typename Func> 6108bbe119SEd Tanous self_t& onopen(Func f) 6208bbe119SEd Tanous { 6308bbe119SEd Tanous openHandler = f; 6408bbe119SEd Tanous return *this; 6508bbe119SEd Tanous } 6608bbe119SEd Tanous 6708bbe119SEd Tanous template <typename Func> 6808bbe119SEd Tanous self_t& onclose(Func f) 6908bbe119SEd Tanous { 7008bbe119SEd Tanous closeHandler = f; 7108bbe119SEd Tanous return *this; 7208bbe119SEd Tanous } 7308bbe119SEd Tanous 7408bbe119SEd Tanous private: 7508bbe119SEd Tanous std::function<void(crow::sse_socket::Connection&)> openHandler; 7608bbe119SEd Tanous std::function<void(crow::sse_socket::Connection&)> closeHandler; 7708bbe119SEd Tanous }; 7808bbe119SEd Tanous 7908bbe119SEd Tanous } // namespace crow 80