// SPDX-License-Identifier: Apache-2.0 // SPDX-FileCopyrightText: Copyright OpenBMC Authors #pragma once #include "async_resp.hpp" #include "baserule.hpp" #include "http_request.hpp" #include "logging.hpp" #include "websocket.hpp" #include #include #include #include #include #include #include #include namespace crow { class WebSocketRule : public BaseRule { using self_t = WebSocketRule; public: explicit WebSocketRule(const std::string& ruleIn) : BaseRule(ruleIn) { isUpgrade = true; // Clear GET handler methodsBitfield = 0; } void validate() override {} void handle(const Request& /*req*/, const std::shared_ptr& asyncResp, const std::vector& /*params*/) override { BMCWEB_LOG_ERROR( "Handle called on websocket rule. This should never happen"); asyncResp->res.result( boost::beast::http::status::internal_server_error); } void handleUpgrade(const Request& req, const std::shared_ptr& /*asyncResp*/, boost::asio::ip::tcp::socket&& adaptor) override; void handleUpgrade(const Request& req, const std::shared_ptr& /*asyncResp*/, boost::asio::ssl::stream&& adaptor) override; template self_t& onopen(Func f) { openHandler = f; return *this; } template self_t& onmessage(Func f) { messageHandler = f; return *this; } template self_t& onmessageex(Func f) { messageExHandler = f; return *this; } template self_t& onclose(Func f) { closeHandler = f; return *this; } template self_t& onerror(Func f) { errorHandler = f; return *this; } protected: std::function openHandler; std::function messageHandler; std::function&& whenComplete)> messageExHandler; std::function closeHandler; std::function errorHandler; }; } // namespace crow