/* */ #include "CookieParser.h" #include "Util.h" #include "A2STR.h" #include #include #include #include namespace aria2 { const std::string CookieParser::C_SECURE("secure"); const std::string CookieParser::C_DOMAIN("domain"); const std::string CookieParser::C_PATH("path"); const std::string CookieParser::C_EXPIRES("expires"); Cookie CookieParser::parse(const std::string& cookieStr) const { return parse(cookieStr, A2STR::NIL, A2STR::NIL); } Cookie CookieParser::parse(const std::string& cookieStr, const std::string& defaultDomain, const std::string& defaultPath) const { std::deque terms; Util::slice(terms, Util::trim(cookieStr), ';', true); if(terms.empty()) { return Cookie(); } std::pair nameValue; Util::split(nameValue, terms.front(), '='); std::map values; values[C_DOMAIN] = defaultDomain; values[C_PATH] = defaultPath; for(std::deque::iterator itr = terms.begin()+1; itr != terms.end(); ++itr) { std::pair nv; Util::split(nv, *itr, '='); values[nv.first] = nv.second; } time_t expiry = -1; if(values.find(C_EXPIRES) != values.end()) { expiry = Util::httpGMT(values[C_EXPIRES]); } if(expiry == -1) { return Cookie(nameValue.first, nameValue.second, values[C_PATH], values[C_DOMAIN], values.find(C_SECURE) != values.end()); } else { return Cookie(nameValue.first, nameValue.second, expiry, values[C_PATH], values[C_DOMAIN], values.find(C_SECURE) != values.end()); } } Cookies CookieParser::parse(std::istream& s) const { Cookies cookies; std::string line; while(getline(s, line)) { if(Util::trim(line).empty() || Util::startsWith(line, A2STR::SHARP_C)) { continue; } Cookie cookie = parse(line); if(cookie.good()) { cookies.push_back(cookie); } } return cookies; } } // namespace aria2