blob: e32af57b4c6377284dca27b6ae75abb08357980c [file] [log] [blame]
Ed Tanous40e9b922024-09-10 13:50:16 -07001// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright OpenBMC Authors
Ed Tanous08bbe112023-04-06 13:10:02 -07003#pragma once
4
Ed Tanousd7857202025-01-28 15:32:26 -08005#include "async_resp.hpp"
Ed Tanous08bbe112023-04-06 13:10:02 -07006#include "baserule.hpp"
7#include "http_request.hpp"
8#include "http_response.hpp"
Ed Tanousd7857202025-01-28 15:32:26 -08009#include "logging.hpp"
Ed Tanous08bbe112023-04-06 13:10:02 -070010#include "server_sent_event.hpp"
11
Ed Tanousd7857202025-01-28 15:32:26 -080012#include <boost/asio/ip/tcp.hpp>
13#include <boost/asio/ssl/stream.hpp>
14#include <boost/beast/http/status.hpp>
Ed Tanous08bbe112023-04-06 13:10:02 -070015
16#include <functional>
17#include <memory>
18#include <string>
Ed Tanousd7857202025-01-28 15:32:26 -080019#include <utility>
20#include <vector>
Ed Tanous08bbe112023-04-06 13:10:02 -070021
22namespace crow
23{
24
25class SseSocketRule : public BaseRule
26{
27 using self_t = SseSocketRule;
28
29 public:
Ed Tanousa3b9eb92024-06-03 08:39:37 -070030 explicit SseSocketRule(const std::string& ruleIn) : BaseRule(ruleIn)
31 {
32 isUpgrade = true;
33 // Clear GET handler
34 methodsBitfield = 0;
35 }
Ed Tanous08bbe112023-04-06 13:10:02 -070036
37 void validate() override {}
38
39 void handle(const Request& /*req*/,
40 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
41 const std::vector<std::string>& /*params*/) override
42 {
Ed Tanousa3b9eb92024-06-03 08:39:37 -070043 BMCWEB_LOG_ERROR(
44 "Handle called on websocket rule. This should never happen");
45 asyncResp->res.result(
46 boost::beast::http::status::internal_server_error);
Ed Tanous08bbe112023-04-06 13:10:02 -070047 }
48
Ed Tanousf80a87f2024-06-16 12:10:33 -070049 void handleUpgrade(const Request& req,
Ed Tanous08bbe112023-04-06 13:10:02 -070050 const std::shared_ptr<bmcweb::AsyncResp>& /*asyncResp*/,
51 boost::asio::ip::tcp::socket&& adaptor) override
52 {
53 std::shared_ptr<
54 crow::sse_socket::ConnectionImpl<boost::asio::ip::tcp::socket>>
55 myConnection = std::make_shared<
56 crow::sse_socket::ConnectionImpl<boost::asio::ip::tcp::socket>>(
Ed Tanous93cf0ac2024-03-28 00:35:13 -070057 std::move(adaptor), openHandler, closeHandler);
Ed Tanousf80a87f2024-06-16 12:10:33 -070058 myConnection->start(req);
Ed Tanous08bbe112023-04-06 13:10:02 -070059 }
Ed Tanousf80a87f2024-06-16 12:10:33 -070060 void handleUpgrade(const Request& req,
Ed Tanous08bbe112023-04-06 13:10:02 -070061 const std::shared_ptr<bmcweb::AsyncResp>& /*asyncResp*/,
Ed Tanous003301a2024-04-16 09:59:19 -070062 boost::asio::ssl::stream<boost::asio::ip::tcp::socket>&&
Ed Tanous08bbe112023-04-06 13:10:02 -070063 adaptor) override
64 {
65 std::shared_ptr<crow::sse_socket::ConnectionImpl<
Ed Tanous003301a2024-04-16 09:59:19 -070066 boost::asio::ssl::stream<boost::asio::ip::tcp::socket>>>
Ed Tanous08bbe112023-04-06 13:10:02 -070067 myConnection = std::make_shared<crow::sse_socket::ConnectionImpl<
Ed Tanous003301a2024-04-16 09:59:19 -070068 boost::asio::ssl::stream<boost::asio::ip::tcp::socket>>>(
Ed Tanous93cf0ac2024-03-28 00:35:13 -070069 std::move(adaptor), openHandler, closeHandler);
Ed Tanousf80a87f2024-06-16 12:10:33 -070070 myConnection->start(req);
Ed Tanous08bbe112023-04-06 13:10:02 -070071 }
Ed Tanous08bbe112023-04-06 13:10:02 -070072
73 template <typename Func>
74 self_t& onopen(Func f)
75 {
76 openHandler = f;
77 return *this;
78 }
79
80 template <typename Func>
81 self_t& onclose(Func f)
82 {
83 closeHandler = f;
84 return *this;
85 }
86
87 private:
Ed Tanousf80a87f2024-06-16 12:10:33 -070088 std::function<void(crow::sse_socket::Connection&, const crow::Request&)>
89 openHandler;
Ed Tanous08bbe112023-04-06 13:10:02 -070090 std::function<void(crow::sse_socket::Connection&)> closeHandler;
91};
92
93} // namespace crow