/* */ #include "CookieParser.h" #include #include #include #include #include "Util.h" #include "A2STR.h" #include "TimeA2.h" 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 = 0; if(values.find(C_EXPIRES) != values.end()) { Time expiryTime = Time::parseHTTPDate(values[C_EXPIRES]); if(expiryTime.good()) { expiry = expiryTime.getTime(); } } 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