#include #include #include #include #include #include namespace mbgl { namespace http { CacheControl CacheControl::parse(const std::string& value) { namespace qi = boost::spirit::qi; namespace phoenix = boost::phoenix; CacheControl result; qi::phrase_parse(value.begin(), value.end(), ( (qi::lit("must-revalidate") [ phoenix::ref(result.mustRevalidate) = true ]) | (qi::lit("max-age") >> '=' >> qi::ulong_long [ phoenix::ref(result.maxAge) = qi::_1 ]) | (*(('"' >> *(('\\' >> qi::char_) | (qi::char_ - '"')) >> '"') | (qi::char_ - '"' - ','))) ) % ',', qi::ascii::space); return result; } optional CacheControl::toTimePoint() const { return maxAge ? util::now() + Seconds(*maxAge) : optional{}; } optional parseRetryHeaders(const optional& retryAfter, const optional& xRateLimitReset) { if (retryAfter) { try { auto secs = std::chrono::seconds(std::stoi(*retryAfter)); return std::chrono::time_point_cast(util::now() + secs); } catch (...) { return util::parseTimestamp((*retryAfter).c_str()); } } else if (xRateLimitReset) { try { return util::parseTimestamp(std::stoi(*xRateLimitReset)); } catch (...) { return {}; } } return {}; } } // namespace http } // namespace mbgl