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" 6*84aad24dSrohitpai #include "parsing.hpp" 7fdf51f5cSRohit PAI 8fdf51f5cSRohit PAI #include <boost/beast/http/verb.hpp> 9*84aad24dSrohitpai #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: 20fdf51f5cSRohit PAI explicit SubRequest(const crow::Request& req) : 21fdf51f5cSRohit PAI url_(req.url().encoded_path()), method_(req.method()) 22*84aad24dSrohitpai { 23*84aad24dSrohitpai // Extract OEM payload if present 24*84aad24dSrohitpai if (req.method() == boost::beast::http::verb::patch || 25*84aad24dSrohitpai req.method() == boost::beast::http::verb::post) 26*84aad24dSrohitpai { 27*84aad24dSrohitpai nlohmann::json reqJson; 28*84aad24dSrohitpai if (parseRequestAsJson(req, reqJson) != JsonParseResult::Success) 29*84aad24dSrohitpai { 30*84aad24dSrohitpai return; 31*84aad24dSrohitpai } 32*84aad24dSrohitpai 33*84aad24dSrohitpai auto oemIt = reqJson.find("Oem"); 34*84aad24dSrohitpai if (oemIt != reqJson.end() && oemIt->is_object()) 35*84aad24dSrohitpai { 36*84aad24dSrohitpai const nlohmann::json::object_t* oemObj = 37*84aad24dSrohitpai oemIt->get_ptr<const nlohmann::json::object_t*>(); 38*84aad24dSrohitpai if (oemObj != nullptr && !oemObj->empty()) 39*84aad24dSrohitpai { 40*84aad24dSrohitpai payload_ = *oemObj; 41*84aad24dSrohitpai } 42*84aad24dSrohitpai } 43*84aad24dSrohitpai } 44*84aad24dSrohitpai } 45fdf51f5cSRohit PAI 46fdf51f5cSRohit PAI std::string_view url() const 47fdf51f5cSRohit PAI { 48fdf51f5cSRohit PAI return url_; 49fdf51f5cSRohit PAI } 50fdf51f5cSRohit PAI 51fdf51f5cSRohit PAI boost::beast::http::verb method() const 52fdf51f5cSRohit PAI { 53fdf51f5cSRohit PAI return method_; 54fdf51f5cSRohit PAI } 55fdf51f5cSRohit PAI 56*84aad24dSrohitpai const nlohmann::json::object_t& payload() const 57*84aad24dSrohitpai { 58*84aad24dSrohitpai return payload_; 59*84aad24dSrohitpai } 60*84aad24dSrohitpai 61*84aad24dSrohitpai bool needHandling() const 62*84aad24dSrohitpai { 63*84aad24dSrohitpai if (method_ == boost::beast::http::verb::get) 64*84aad24dSrohitpai { 65*84aad24dSrohitpai return true; 66*84aad24dSrohitpai } 67*84aad24dSrohitpai 68*84aad24dSrohitpai if ((method_ == boost::beast::http::verb::patch || 69*84aad24dSrohitpai method_ == boost::beast::http::verb::post) && 70*84aad24dSrohitpai !payload_.empty()) 71*84aad24dSrohitpai { 72*84aad24dSrohitpai return true; 73*84aad24dSrohitpai } 74*84aad24dSrohitpai 75*84aad24dSrohitpai return false; 76*84aad24dSrohitpai } 77*84aad24dSrohitpai 78fdf51f5cSRohit PAI private: 79fdf51f5cSRohit PAI std::string url_; 80fdf51f5cSRohit PAI boost::beast::http::verb method_; 81*84aad24dSrohitpai nlohmann::json::object_t payload_; 82fdf51f5cSRohit PAI }; 83fdf51f5cSRohit PAI 84fdf51f5cSRohit PAI } // namespace redfish 85