1 #include <mbgl/util/http_header.hpp>
2 
3 #include <mbgl/util/string.hpp>
4 
5 #pragma GCC diagnostic push
6 #pragma GCC diagnostic ignored "-Wunknown-pragmas"
7 #pragma GCC diagnostic ignored "-Wunused-parameter"
8 #pragma GCC diagnostic ignored "-Wshadow"
9 #pragma clang diagnostic push
10 
11 #pragma clang diagnostic ignored "-Wshorten-64-to-32"
12 #pragma clang diagnostic ignored "-Wunknown-warning-option"
13 #pragma clang diagnostic ignored "-Wtautological-constant-compare"
14 #include <boost/spirit/include/qi.hpp>
15 #include <boost/spirit/include/phoenix_core.hpp>
16 #include <boost/spirit/include/phoenix_operator.hpp>
17 #pragma clang diagnostic pop
18 #pragma GCC diagnostic pop
19 
20 namespace mbgl {
21 namespace http {
22 
parse(const std::string & value)23 CacheControl CacheControl::parse(const std::string& value) {
24     namespace qi = boost::spirit::qi;
25     namespace phoenix = boost::phoenix;
26 
27     CacheControl result;
28     qi::phrase_parse(value.begin(), value.end(), (
29         (qi::lit("must-revalidate") [ phoenix::ref(result.mustRevalidate) = true ]) |
30         (qi::lit("max-age") >> '=' >> qi::ulong_long [ phoenix::ref(result.maxAge) = qi::_1 ]) |
31         (*(('"' >> *(('\\' >> qi::char_) | (qi::char_ - '"')) >> '"') | (qi::char_ - '"' - ',')))
32     ) % ',', qi::ascii::space);
33     return result;
34 }
35 
toTimePoint() const36 optional<Timestamp> CacheControl::toTimePoint() const {
37     return maxAge ? util::now() + Seconds(*maxAge) : optional<Timestamp>{};
38 }
39 
parseRetryHeaders(const optional<std::string> & retryAfter,const optional<std::string> & xRateLimitReset)40 optional<Timestamp> parseRetryHeaders(const optional<std::string>& retryAfter,
41                                       const optional<std::string>& xRateLimitReset) {
42     if (retryAfter) {
43         try {
44             auto secs = std::chrono::seconds(std::stoi(*retryAfter));
45             return std::chrono::time_point_cast<Seconds>(std::chrono::system_clock::now() + secs);
46         } catch (...) {
47             return util::parseTimestamp((*retryAfter).c_str());
48         }
49     } else if (xRateLimitReset) {
50         try {
51             return util::parseTimestamp(std::stoi(*xRateLimitReset));
52         } catch (...) {
53             return {};
54         }
55     }
56 
57     return {};
58 }
59 
60 } // namespace http
61 } // namespace mbgl
62