/* */ #ifndef _D_COOKIE_STORAGE_H_ #define _D_COOKIE_STORAGE_H_ #include "common.h" #include #include #include #include "a2time.h" #include "Cookie.h" #include "CookieParser.h" namespace aria2 { class Logger; class CookieStorage { public: static const size_t MAX_COOKIE_PER_DOMAIN = 50; class DomainEntry { private: std::string _key; time_t _lastAccess; std::deque _cookies; public: DomainEntry(const std::string& domain); const std::string& getKey() const { return _key; } template OutputIterator findCookie (OutputIterator out, const std::string& requestHost, const std::string& requestPath, time_t date, bool secure) { for(std::deque::iterator i = _cookies.begin(); i != _cookies.end(); ++i) { if((*i).match(requestHost, requestPath, date, secure)) { (*i).updateLastAccess(); out++ = *i; } } return out; } size_t countCookie() const { return _cookies.size(); } bool addCookie(const Cookie& cookie); void updateLastAccess(); time_t getLastAccess() const { return _lastAccess; } void writeCookie(std::ostream& o) const; bool contains(const Cookie& cookie) const; template OutputIterator dumpCookie(OutputIterator out) const { return std::copy(_cookies.begin(), _cookies.end(), out); } bool operator<(const DomainEntry& de) const { return _key < de._key; } }; private: std::deque _domains; CookieParser _parser; Logger* _logger; void storeCookies(const std::deque& cookies); public: CookieStorage(); ~CookieStorage(); // Returns true if cookie is stored or updated existing cookie. // Returns false if cookie is expired. bool store(const Cookie& cookie); // Returns true if cookie is stored or updated existing cookie. // Otherwise, returns false. bool parseAndStore(const std::string& setCookieString, const std::string& requestHost, const std::string& requestPath); // Finds cookies matched with given criteria and returns them. // Matched cookies' _lastAccess property is updated. std::deque criteriaFind(const std::string& requestHost, const std::string& requestPath, time_t date, bool secure); // Loads Cookies from file denoted by filename. If compiled with // libsqlite3, this method automatically detects the specified file // is sqlite3 or just plain text file and calls appropriate parser // implementation class. If Cookies are successfully loaded, this // method returns true. Otherwise, this method returns false. bool load(const std::string& filename); // Saves Cookies in Netspace format which is used in // Firefox1.2/Netscape/Mozilla. If Cookies are successfully saved, // this method returns true, otherwise returns false. bool saveNsFormat(const std::string& filename); // Returns the number of cookies this object stores. size_t size() const; // Returns true if this object contains a cookie x where x == cookie // satisfies. bool contains(const Cookie& cookie) const; template OutputIterator dumpCookie(OutputIterator out) const { for(std::deque::const_iterator i = _domains.begin(); i != _domains.end(); ++i) { out = (*i).dumpCookie(out); } return out; } }; } // namespace aria2 #endif // _D_COOKIE_STORAGE_H_