xref: /openbmc/bmcweb/http/parsing.hpp (revision d78572018fc2022091ff8b8eb5a7fef2172ba3d6)
140e9b92eSEd Tanous // SPDX-License-Identifier: Apache-2.0
240e9b92eSEd Tanous // SPDX-FileCopyrightText: Copyright OpenBMC Authors
31aa0c2b8SEd Tanous #pragma once
41aa0c2b8SEd Tanous 
5*d7857201SEd Tanous #include "bmcweb_config.h"
6*d7857201SEd Tanous 
71aa0c2b8SEd Tanous #include "http/http_request.hpp"
8e4628c81SEd Tanous #include "http_utility.hpp"
91aa0c2b8SEd Tanous #include "logging.hpp"
101aa0c2b8SEd Tanous 
11*d7857201SEd Tanous #include <boost/beast/http/field.hpp>
121aa0c2b8SEd Tanous #include <nlohmann/json.hpp>
131aa0c2b8SEd Tanous 
1418f8f608SEd Tanous #include <cctype>
151aa0c2b8SEd Tanous #include <string_view>
161aa0c2b8SEd Tanous 
171aa0c2b8SEd Tanous enum class JsonParseResult
181aa0c2b8SEd Tanous {
191aa0c2b8SEd Tanous     BadContentType,
201aa0c2b8SEd Tanous     BadJsonData,
211aa0c2b8SEd Tanous     Success,
221aa0c2b8SEd Tanous };
231aa0c2b8SEd Tanous 
isJsonContentType(std::string_view contentType)2418f8f608SEd Tanous inline bool isJsonContentType(std::string_view contentType)
2518f8f608SEd Tanous {
26e4628c81SEd Tanous     return http_helpers::getContentType(contentType) ==
27e4628c81SEd Tanous            http_helpers::ContentType::JSON;
2818f8f608SEd Tanous }
2918f8f608SEd Tanous 
parseRequestAsJson(const crow::Request & req,nlohmann::json & jsonOut)301aa0c2b8SEd Tanous inline JsonParseResult parseRequestAsJson(const crow::Request& req,
311aa0c2b8SEd Tanous                                           nlohmann::json& jsonOut)
321aa0c2b8SEd Tanous {
3318f8f608SEd Tanous     if (!isJsonContentType(
3418f8f608SEd Tanous             req.getHeaderValue(boost::beast::http::field::content_type)))
351aa0c2b8SEd Tanous     {
3662598e31SEd Tanous         BMCWEB_LOG_WARNING("Failed to parse content type on request");
3783328316SEd Tanous         if constexpr (!BMCWEB_INSECURE_IGNORE_CONTENT_TYPE)
3883328316SEd Tanous         {
391aa0c2b8SEd Tanous             return JsonParseResult::BadContentType;
4083328316SEd Tanous         }
411aa0c2b8SEd Tanous     }
4233c6b580SEd Tanous     jsonOut = nlohmann::json::parse(req.body(), nullptr, false);
431aa0c2b8SEd Tanous     if (jsonOut.is_discarded())
441aa0c2b8SEd Tanous     {
4562598e31SEd Tanous         BMCWEB_LOG_WARNING("Failed to parse json in request");
461aa0c2b8SEd Tanous         return JsonParseResult::BadJsonData;
471aa0c2b8SEd Tanous     }
481aa0c2b8SEd Tanous 
491aa0c2b8SEd Tanous     return JsonParseResult::Success;
501aa0c2b8SEd Tanous }
51