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 Tanousinline 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 Tanousinline 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