xref: /openbmc/bmcweb/http/routing/sserule.hpp (revision 93cf0ac2)
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