1 // SPDX-License-Identifier: Apache-2.0 2 // SPDX-FileCopyrightText: Copyright OpenBMC Authors 3 #pragma once 4 5 #include "baserule.hpp" 6 #include "http_request.hpp" 7 #include "http_response.hpp" 8 #include "server_sent_event.hpp" 9 10 #include <boost/beast/http/verb.hpp> 11 12 #include <functional> 13 #include <memory> 14 #include <string> 15 16 namespace crow 17 { 18 19 class SseSocketRule : public BaseRule 20 { 21 using self_t = SseSocketRule; 22 23 public: 24 explicit SseSocketRule(const std::string& ruleIn) : BaseRule(ruleIn) 25 { 26 isUpgrade = true; 27 // Clear GET handler 28 methodsBitfield = 0; 29 } 30 31 void validate() override {} 32 33 void handle(const Request& /*req*/, 34 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, 35 const std::vector<std::string>& /*params*/) override 36 { 37 BMCWEB_LOG_ERROR( 38 "Handle called on websocket rule. This should never happen"); 39 asyncResp->res.result( 40 boost::beast::http::status::internal_server_error); 41 } 42 43 void handleUpgrade(const Request& req, 44 const std::shared_ptr<bmcweb::AsyncResp>& /*asyncResp*/, 45 boost::asio::ip::tcp::socket&& adaptor) override 46 { 47 std::shared_ptr< 48 crow::sse_socket::ConnectionImpl<boost::asio::ip::tcp::socket>> 49 myConnection = std::make_shared< 50 crow::sse_socket::ConnectionImpl<boost::asio::ip::tcp::socket>>( 51 std::move(adaptor), openHandler, closeHandler); 52 myConnection->start(req); 53 } 54 void handleUpgrade(const Request& req, 55 const std::shared_ptr<bmcweb::AsyncResp>& /*asyncResp*/, 56 boost::asio::ssl::stream<boost::asio::ip::tcp::socket>&& 57 adaptor) override 58 { 59 std::shared_ptr<crow::sse_socket::ConnectionImpl< 60 boost::asio::ssl::stream<boost::asio::ip::tcp::socket>>> 61 myConnection = std::make_shared<crow::sse_socket::ConnectionImpl< 62 boost::asio::ssl::stream<boost::asio::ip::tcp::socket>>>( 63 std::move(adaptor), openHandler, closeHandler); 64 myConnection->start(req); 65 } 66 67 template <typename Func> 68 self_t& onopen(Func f) 69 { 70 openHandler = f; 71 return *this; 72 } 73 74 template <typename Func> 75 self_t& onclose(Func f) 76 { 77 closeHandler = f; 78 return *this; 79 } 80 81 private: 82 std::function<void(crow::sse_socket::Connection&, const crow::Request&)> 83 openHandler; 84 std::function<void(crow::sse_socket::Connection&)> closeHandler; 85 }; 86 87 } // namespace crow 88