xref: /openbmc/bmcweb/include/http_utility.hpp (revision 530520ea)
1 #pragma once
2 #include <boost/algorithm/string.hpp>
3 
4 namespace http_helpers
5 {
6 inline bool requestPrefersHtml(const crow::Request& req)
7 {
8     boost::string_view header = req.getHeaderValue("accept");
9     std::vector<std::string> encodings;
10     // chrome currently sends 6 accepts headers, firefox sends 4.
11     encodings.reserve(6);
12     boost::split(encodings, header, boost::is_any_of(", "),
13                  boost::token_compress_on);
14     for (const std::string& encoding : encodings)
15     {
16         if (encoding == "text/html")
17         {
18             return true;
19         }
20         else if (encoding == "application/json")
21         {
22             return false;
23         }
24     }
25     return false;
26 }
27 
28 inline std::string urlEncode(const boost::string_view value)
29 {
30     std::ostringstream escaped;
31     escaped.fill('0');
32     escaped << std::hex;
33 
34     for (const char c : value)
35     {
36         // Keep alphanumeric and other accepted characters intact
37         if (isalnum(c) || c == '-' || c == '_' || c == '.' || c == '~')
38         {
39             escaped << c;
40             continue;
41         }
42 
43         // Any other characters are percent-encoded
44         escaped << std::uppercase;
45         escaped << '%' << std::setw(2)
46                 << static_cast<int>(static_cast<unsigned char>(c));
47         escaped << std::nouppercase;
48     }
49 
50     return escaped.str();
51 }
52 } // namespace http_helpers