/* */ #ifndef _D_HTTP_REQUEST_H_ #define _D_HTTP_REQUEST_H_ #include "common.h" #include #include #include #include "SharedHandle.h" #include "Request.h" #include "FileEntry.h" namespace aria2 { class Segment; class Range; class Option; class CookieStorage; class AuthConfigFactory; class AuthConfig; class HttpRequest { private: static const std::string USER_AGENT; SharedHandle request; SharedHandle _fileEntry; SharedHandle segment; bool _contentEncodingEnabled; std::string userAgent; std::deque _headers; std::deque _acceptTypes; SharedHandle _cookieStorage; SharedHandle _authConfigFactory; const Option* _option; SharedHandle _authConfig; SharedHandle _proxyRequest; std::string getProxyAuthString() const; public: HttpRequest(); const SharedHandle& getSegment() const { return segment; } void setSegment(const SharedHandle& segment); void setRequest(const SharedHandle& request); uint64_t getEntityLength() const { assert(!_fileEntry.isNull()); return _fileEntry->getLength(); } const std::string& getHost() const { return request->getHost(); } uint16_t getPort() const { return request->getPort(); } const std::string& getMethod() const { return request->getMethod(); } const std::string& getProtocol() const { return request->getProtocol(); } const std::string& getCurrentURI() const { return request->getCurrentUrl(); } const std::string& getDir() const { return request->getDir(); } const std::string& getFile() const { return request->getFile(); } const std::string& getQuery() const { return request->getQuery(); } const std::string& getPreviousURI() const { return request->getPreviousUrl(); } std::string getURIHost() const { return request->getURIHost(); } SharedHandle getRange() const; /** * Inspects whether the specified response range is satisfiable * with request range. */ bool isRangeSatisfied(const SharedHandle& range) const; const SharedHandle& getRequest() const { return request; } 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, delimited 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); const SharedHandle& getCookieStorage() const { return _cookieStorage; } void setAuthConfigFactory (const SharedHandle& factory, const Option* option); /* * 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; void setFileEntry(const SharedHandle& fileEntry) { _fileEntry = fileEntry; } const SharedHandle& getFileEntry() const { return _fileEntry; } }; typedef SharedHandle HttpRequestHandle; typedef std::deque HttpRequests; } // namespace aria2 #endif // _D_HTTP_REQUEST_H_