1fdf51f5cSRohit PAI // SPDX-License-Identifier: Apache-2.0 2fdf51f5cSRohit PAI // SPDX-FileCopyrightText: Copyright OpenBMC Authors 3fdf51f5cSRohit PAI #pragma once 4fdf51f5cSRohit PAI 5fdf51f5cSRohit PAI #include "http_request.hpp" 684aad24dSrohitpai #include "parsing.hpp" 7fdf51f5cSRohit PAI 8fdf51f5cSRohit PAI #include <boost/beast/http/verb.hpp> 984aad24dSrohitpai #include <nlohmann/json.hpp> 10fdf51f5cSRohit PAI 11fdf51f5cSRohit PAI #include <string> 12fdf51f5cSRohit PAI #include <string_view> 13fdf51f5cSRohit PAI 14fdf51f5cSRohit PAI namespace redfish 15fdf51f5cSRohit PAI { 16fdf51f5cSRohit PAI 17fdf51f5cSRohit PAI class SubRequest 18fdf51f5cSRohit PAI { 19fdf51f5cSRohit PAI public: SubRequest(const crow::Request & req)20fdf51f5cSRohit PAI explicit SubRequest(const crow::Request& req) : 21fdf51f5cSRohit PAI url_(req.url().encoded_path()), method_(req.method()) 2284aad24dSrohitpai { 2384aad24dSrohitpai // Extract OEM payload if present 2484aad24dSrohitpai if (req.method() == boost::beast::http::verb::patch || 2584aad24dSrohitpai req.method() == boost::beast::http::verb::post) 2684aad24dSrohitpai { 2784aad24dSrohitpai nlohmann::json reqJson; 2884aad24dSrohitpai if (parseRequestAsJson(req, reqJson) != JsonParseResult::Success) 2984aad24dSrohitpai { 3084aad24dSrohitpai return; 3184aad24dSrohitpai } 3284aad24dSrohitpai 3384aad24dSrohitpai auto oemIt = reqJson.find("Oem"); 34*d0a341b9SEd Tanous if (oemIt != reqJson.end()) 3584aad24dSrohitpai { 3684aad24dSrohitpai const nlohmann::json::object_t* oemObj = 3784aad24dSrohitpai oemIt->get_ptr<const nlohmann::json::object_t*>(); 3884aad24dSrohitpai if (oemObj != nullptr && !oemObj->empty()) 3984aad24dSrohitpai { 4084aad24dSrohitpai payload_ = *oemObj; 4184aad24dSrohitpai } 4284aad24dSrohitpai } 4384aad24dSrohitpai } 4484aad24dSrohitpai } 45fdf51f5cSRohit PAI url() const46fdf51f5cSRohit PAI std::string_view url() const 47fdf51f5cSRohit PAI { 48fdf51f5cSRohit PAI return url_; 49fdf51f5cSRohit PAI } 50fdf51f5cSRohit PAI method() const51fdf51f5cSRohit PAI boost::beast::http::verb method() const 52fdf51f5cSRohit PAI { 53fdf51f5cSRohit PAI return method_; 54fdf51f5cSRohit PAI } 55fdf51f5cSRohit PAI payload() const5684aad24dSrohitpai const nlohmann::json::object_t& payload() const 5784aad24dSrohitpai { 5884aad24dSrohitpai return payload_; 5984aad24dSrohitpai } 6084aad24dSrohitpai needHandling() const6184aad24dSrohitpai bool needHandling() const 6284aad24dSrohitpai { 6384aad24dSrohitpai if (method_ == boost::beast::http::verb::get) 6484aad24dSrohitpai { 6584aad24dSrohitpai return true; 6684aad24dSrohitpai } 6784aad24dSrohitpai 6884aad24dSrohitpai if ((method_ == boost::beast::http::verb::patch || 6984aad24dSrohitpai method_ == boost::beast::http::verb::post) && 7084aad24dSrohitpai !payload_.empty()) 7184aad24dSrohitpai { 7284aad24dSrohitpai return true; 7384aad24dSrohitpai } 7484aad24dSrohitpai 7584aad24dSrohitpai return false; 7684aad24dSrohitpai } 7784aad24dSrohitpai 78fdf51f5cSRohit PAI private: 79fdf51f5cSRohit PAI std::string url_; 80fdf51f5cSRohit PAI boost::beast::http::verb method_; 8184aad24dSrohitpai nlohmann::json::object_t payload_; 82fdf51f5cSRohit PAI }; 83fdf51f5cSRohit PAI 84fdf51f5cSRohit PAI } // namespace redfish 85