xref: /openbmc/bmcweb/redfish-core/include/sub_request.hpp (revision d0a341b96370e44a815de13205d19552fb3b1650)
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