1 #pragma once
2 
3 #include "authentication.hpp"
4 #include "http_request.hpp"
5 #include "http_response.hpp"
6 #include "http_utility.hpp"
7 #include "json_html_serializer.hpp"
8 #include "logging.hpp"
9 #include "security_headers.hpp"
10 #include "utils/hex_utils.hpp"
11 
12 #include <boost/beast/http/message.hpp>
13 #include <boost/beast/http/string_body.hpp>
14 #include <nlohmann/json.hpp>
15 
16 #include <array>
17 
18 namespace crow
19 {
20 
21 inline void completeResponseFields(const Request& req, Response& res)
22 {
23     BMCWEB_LOG_INFO("Response:  {} {}", req.url().encoded_path(),
24                     res.resultInt());
25     addSecurityHeaders(req, res);
26 
27     authentication::cleanupTempSession(req);
28 
29     res.setHashAndHandleNotModified();
30 
31     if (res.body().empty() && res.jsonValue.is_structured())
32     {
33         using http_helpers::ContentType;
34         std::array<ContentType, 3> allowed{ContentType::CBOR, ContentType::JSON,
35                                            ContentType::HTML};
36         ContentType prefered =
37             getPreferedContentType(req.getHeaderValue("Accept"), allowed);
38 
39         if (prefered == ContentType::HTML)
40         {
41             json_html_util::prettyPrintJson(res);
42         }
43         else if (prefered == ContentType::CBOR)
44         {
45             res.addHeader(boost::beast::http::field::content_type,
46                           "application/cbor");
47             nlohmann::json::to_cbor(res.jsonValue, res.body());
48         }
49         else
50         {
51             // Technically prefered could also be NoMatch here, but we'd
52             // like to default to something rather than return 400 for
53             // backward compatibility.
54             res.addHeader(boost::beast::http::field::content_type,
55                           "application/json");
56             res.body() = res.jsonValue.dump(
57                 2, ' ', true, nlohmann::json::error_handler_t::replace);
58         }
59     }
60 }
61 } // namespace crow
62