/* */ #ifndef _D_HTTP_REQUEST_H_ #define _D_HTTP_REQUEST_H_ #include "common.h" #include #include #include "SharedHandle.h" namespace aria2 { class Request; class Segment; class Range; class Option; class CookieStorage; class AuthConfigFactory; class AuthConfig; class HttpRequest { private: static const std::string USER_AGENT; SharedHandle request; SharedHandle segment; uint64_t entityLength; bool _contentEncodingEnabled; std::string userAgent; std::deque _headers; std::deque _acceptTypes; SharedHandle _cookieStorage; SharedHandle _authConfigFactory; SharedHandle _authConfig; SharedHandle _proxyRequest; std::string getHostText(const std::string& host, uint16_t port) const; std::string getProxyAuthString() const; public: HttpRequest(); SharedHandle getSegment() const; void setSegment(const SharedHandle& segment); void setRequest(const SharedHandle& request); /** * entityLength is used in isRangeSatisfied() method. */ void setEntityLength(uint64_t entityLength) { this->entityLength = entityLength; } uint64_t getEntityLength() const { return entityLength; } const std::string& getHost() const; uint16_t getPort() const; const std::string& getMethod() const; const std::string& getProtocol() const; const std::string& getCurrentURI() const; const std::string& getDir() const; const std::string& getFile() const; const std::string& getQuery() const; const std::string& getPreviousURI() const; SharedHandle getRange() const; /** * Inspects whether the specified response range is satisfiable * with request range. */ bool isRangeSatisfied(const SharedHandle& range) const; SharedHandle getRequest() const; off_t getStartByte() const; off_t getEndByte() const; /** * Returns string representation of http request. It usually starts * with "GET ..." and ends with "\r\n". The AuthConfig for this * request is resolved using _authConfigFactory and stored in * _authConfig. getAuthConfig() returns AuthConfig used in the last * invocation of createRequest(). */ std::string createRequest(); /** * Returns string representation of http tunnel request. * It usually starts with "CONNECT ..." and ends with "\r\n". */ std::string createProxyRequest() const; void enableContentEncoding(); void disableContentEncoding(); void setUserAgent(const std::string& userAgent) { this->userAgent = userAgent; } // accepts multiline headers, deliminated by LF void addHeader(const std::string& headers); void addAcceptType(const std::string& type); template void addAcceptType(InputIterator first, InputIterator last) { _acceptTypes.insert(_acceptTypes.end(), first, last); } void setCookieStorage(const SharedHandle& cookieStorage); SharedHandle getCookieStorage() const; void setAuthConfigFactory(const SharedHandle& factory); /* * To use proxy, pass proxy string to Request::setUrl() and set it this * object. */ void setProxyRequest(const SharedHandle& proxyRequest); /* * Returns true if non-Null proxy request is set by setProxyRequest(). * Otherwise, returns false. */ bool isProxyRequestSet() const; // Returns true if authentication was used in the last // createRequest(). bool authenticationUsed() const; // Returns AuthConfig used in the last invocation of // createRequest(). const SharedHandle& getAuthConfig() const; }; typedef SharedHandle HttpRequestHandle; typedef std::deque HttpRequests; } // namespace aria2 #endif // _D_HTTP_REQUEST_H_