/* */ #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::vector headers_; std::vector acceptTypes_; SharedHandle cookieStorage_; SharedHandle authConfigFactory_; const Option* option_; SharedHandle authConfig_; SharedHandle proxyRequest_; bool noCache_; bool acceptGzip_; off_t endOffsetOverride_; std::string ifModSinceHeader_; std::pair 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_->getCurrentUri(); } 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_->getPreviousUri(); } 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) { 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::setUri() 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_; } void enableNoCache() { noCache_ = true; } void disableNoCache() { noCache_ = false; } void enableAcceptGZip() { acceptGzip_ = true; } void disableAcceptGZip() { acceptGzip_ = false; } bool acceptGZip() const { return acceptGzip_; } void setEndOffsetOverride(off_t offset) { endOffsetOverride_ = offset; } void setIfModifiedSinceHeader(const std::string& hd) { ifModSinceHeader_ = hd; } const std::string& getIfModifiedSinceHeader() const { return ifModSinceHeader_; } }; } // namespace aria2 #endif // _D_HTTP_REQUEST_H_