xref: /openbmc/bmcweb/features/redfish/include/query.hpp (revision a6b9125ff91500afed34dc923e9bafb90da75ec4)
1 #pragma once
2 
3 #include "utils/query_param.hpp"
4 
5 #include <bmcweb_config.h>
6 
7 namespace redfish
8 {
9 
10 // Sets up the Redfish Route and delegates some of the query parameter
11 // processing. |queryCapabilities| stores which query parameters will be
12 // handled by redfish-core/lib codes, then default query parameter handler won't
13 // process these parameters.
14 [[nodiscard]] inline bool setUpRedfishRouteWithDelegation(
15     crow::App& app, const crow::Request& req, crow::Response& res,
16     query_param::Query& delegated,
17     const query_param::QueryCapabilities& queryCapabilities)
18 {
19     BMCWEB_LOG_DEBUG << "setup redfish route";
20 
21     // Section 7.4 of the redfish spec "Redfish Services shall process the
22     // [OData-Version header] in the following table as defined by the HTTP 1.1
23     // specification..."
24     // Required to pass redfish-protocol-validator REQ_HEADERS_ODATA_VERSION
25     std::string_view odataHeader = req.getHeaderValue("OData-Version");
26     if (!odataHeader.empty() && odataHeader != "4.0")
27     {
28         messages::preconditionFailed(res);
29         return false;
30     }
31 
32     // If query parameters aren't enabled, do nothing.
33     if constexpr (!bmcwebInsecureEnableQueryParams)
34     {
35         return true;
36     }
37     std::optional<query_param::Query> queryOpt =
38         query_param::parseParameters(req.urlView.params(), res);
39     if (queryOpt == std::nullopt)
40     {
41         return false;
42     }
43 
44     // If this isn't a get, no need to do anything with parameters
45     if (req.method() != boost::beast::http::verb::get)
46     {
47         return true;
48     }
49 
50     delegated = query_param::delegate(queryCapabilities, *queryOpt);
51     std::function<void(crow::Response&)> handler =
52         res.releaseCompleteRequestHandler();
53     res.setCompleteRequestHandler(
54         [&app, handler(std::move(handler)),
55          query{*queryOpt}](crow::Response& res) mutable {
56             processAllParams(app, query, handler, res);
57         });
58     return true;
59 }
60 
61 // Sets up the Redfish Route. All parameters are handled by the default handler.
62 [[nodiscard]] inline bool setUpRedfishRoute(crow::App& app,
63                                             const crow::Request& req,
64                                             crow::Response& res)
65 {
66     // This route |delegated| is never used
67     query_param::Query delegated;
68     return setUpRedfishRouteWithDelegation(app, req, res, delegated,
69                                            query_param::QueryCapabilities{});
70 }
71 } // namespace redfish
72