xref: /openbmc/bmcweb/http/complete_response_fields.hpp (revision 425e81c6ff4339b6dbebaad75e9a8393e5a7d09b)
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 <nlohmann/json.hpp>
14 
15 #include <array>
16 
17 namespace crow
18 {
19 
20 inline void completeResponseFields(const Request& req, Response& res)
21 {
22     BMCWEB_LOG_INFO("Response:  {} {}", req.url().encoded_path(),
23                     res.resultInt());
24     addSecurityHeaders(req, res);
25 
26     authentication::cleanupTempSession(req);
27 
28     res.setHashAndHandleNotModified();
29     if (res.jsonValue.is_structured())
30     {
31         using http_helpers::ContentType;
32         std::array<ContentType, 3> allowed{ContentType::CBOR, ContentType::JSON,
33                                            ContentType::HTML};
34         ContentType preferred =
35             getPreferredContentType(req.getHeaderValue("Accept"), allowed);
36 
37         if (preferred == ContentType::HTML)
38         {
39             json_html_util::prettyPrintJson(res);
40         }
41         else if (preferred == ContentType::CBOR)
42         {
43             res.addHeader(boost::beast::http::field::content_type,
44                           "application/cbor");
45             std::string cbor;
46             nlohmann::json::to_cbor(res.jsonValue, cbor);
47             res.write(std::move(cbor));
48         }
49         else
50         {
51             // Technically preferred 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.write(res.jsonValue.dump(
57                 2, ' ', true, nlohmann::json::error_handler_t::replace));
58         }
59     }
60 }
61 } // namespace crow
62