/* */ #ifndef _D_REQUEST_H_ #define _D_REQUEST_H_ #include "common.h" #include "SharedHandle.h" #include #include #define SAFE_CHARS "abcdefghijklmnopqrstuvwxyz"\ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"\ "0123456789"\ ":/?[]@"\ "!$&'()*+,;="\ "-._~"\ "%"\ "#" namespace aria2 { class CookieBox; class Request { private: std::string url; std::string currentUrl; /** * URL previously requested to the server. This is used as Referer */ std::string previousUrl; /** * URL used as Referer in the initial request */ std::string referer; std::string protocol; std::string host; uint16_t port; std::string dir; std::string file; unsigned int tryCount; // whether or not the server supports persistent connection bool _supportsPersistentConnection; // enable keep-alive if possible. bool _keepAliveHint; // enable pipelining if possible. bool _pipeliningHint; std::string method; std::string _username; std::string _password; bool parseUrl(const std::string& url); bool isHexNumber(const char c) const; std::string urlencode(const std::string& src) const; public: SharedHandle cookieBox; public: Request(); virtual ~Request(); // Parses URL and sets url, host, port, dir, file fields. // Returns true if parsing goes successful, otherwise returns false. bool setUrl(const std::string& url); // Parses URL and sets host, port, dir, file fields. // url field are not altered by this method. // Returns true if parsing goes successful, otherwise returns false. bool redirectUrl(const std::string& url); bool resetUrl(); void resetTryCount() { tryCount = 0; } void addTryCount() { tryCount++; } unsigned int getTryCount() const { return tryCount; } //bool noMoreTry() const { return tryCount >= PREF_MAX_TRY; } std::string getUrl() const { return url; } std::string getCurrentUrl() const { return currentUrl; } std::string getPreviousUrl() const { return previousUrl; } std::string getReferer() const { return referer; } void setReferer(const std::string& url) { referer = previousUrl = url; } std::string getProtocol() const { return protocol; } std::string getHost() const { return host; } uint16_t getPort() const { return port; } std::string getDir() const { return dir; } std::string getFile() const { return file;} void supportsPersistentConnection(bool f) { _supportsPersistentConnection = f; } bool supportsPersistentConnection() { return _supportsPersistentConnection; } bool isKeepAliveEnabled() const { return _supportsPersistentConnection && _keepAliveHint; } void setKeepAliveHint(bool keepAliveHint) { _keepAliveHint = keepAliveHint; } bool isPipeliningEnabled() { return _supportsPersistentConnection && _pipeliningHint; } void setPipeliningHint(bool pipeliningHint) { _pipeliningHint = pipeliningHint; } void setMethod(const std::string& method) { this->method = method; } const std::string& getUsername() const { return _username; } const std::string& getPassword() const { return _password; } const std::string& getMethod() const { return method; } static const std::string METHOD_GET; static const std::string METHOD_HEAD; }; typedef SharedHandle RequestHandle; typedef WeakHandle RequestWeakHandle; typedef std::deque Requests; } // namespace aria2 #endif // _D_REQUEST_H_