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