/* */ #include "NsCookieParser.h" #include #include "util.h" #include "A2STR.h" #include "DlAbortEx.h" #include "StringFormat.h" namespace aria2 { NsCookieParser::NsCookieParser() {} NsCookieParser::~NsCookieParser() {} static const std::string C_TRUE("TRUE"); static Cookie parseNsCookie(const std::string& nsCookieStr) { std::vector vs; util::split(nsCookieStr, std::back_inserter(vs), "\t", true); if(vs.size() < 6 ) { return Cookie(); } int64_t expireDate = util::parseLLInt(vs[4]); // TODO assuming time_t is int32_t... if(expireDate > INT32_MAX) { expireDate = INT32_MAX; } Cookie c(vs[5], // name vs.size() >= 7? vs[6]:A2STR::NIL, // value expireDate, // expires vs[2], // path vs[0], // domain vs[3] == C_TRUE ? true : false); if(!util::startsWith(vs[0], A2STR::DOT_C)) { c.markOriginServerOnly(); } return c; } std::vector NsCookieParser::parse(const std::string& filename) { std::ifstream s(filename.c_str(), std::ios::binary); if(!s) { throw DL_ABORT_EX (StringFormat("Failed to open file %s", filename.c_str()).str()); } std::string line; std::vector cookies; while(getline(s, line)) { if(util::startsWith(line, A2STR::SHARP_C)) { continue; } try { Cookie c = parseNsCookie(line); if(c.good()) { cookies.push_back(c); } } catch(RecoverableException& e) { // ignore malformed cookie entry // TODO better to log it } } return cookies; } } // namespace aria2