/* */ #include "HttpRequest.h" #include "Request.h" #include "Segment.h" #include "Range.h" #include "Cookie.h" #include "CookieBox.h" #include "Option.h" #include "Util.h" #include "Base64.h" #include "prefs.h" #include "AuthConfigFactory.h" #include "AuthConfig.h" namespace aria2 { std::string HttpRequest::USER_AGENT = "aria2"; HttpRequest::HttpRequest():request(0), segment(0), entityLength(0), authEnabled(false), proxyEnabled(false), proxyAuthEnabled(false), userAgent(USER_AGENT) {} SharedHandle HttpRequest::getSegment() const { return segment; } void HttpRequest::setSegment(const SharedHandle& segment) { this->segment = segment; } void HttpRequest::setRequest(const SharedHandle& request) { this->request = request; } SharedHandle HttpRequest::getRequest() const { return request; } int64_t HttpRequest::getStartByte() const { if(segment.isNull()) { return 0; } else { return segment->getPositionToWrite(); } } int64_t HttpRequest::getEndByte() const { if(segment.isNull() || request.isNull()) { return 0; } else { if(request->isKeepAlive()) { return segment->getPosition()+segment->getLength()-1; } else { return 0; } } } RangeHandle HttpRequest::getRange() const { // content-length is always 0 if(segment.isNull()) { return new Range(0, 0, 0); } else { return new Range(getStartByte(), getEndByte(), entityLength); } } bool HttpRequest::isRangeSatisfied(const RangeHandle& range) const { if(segment.isNull()) { return true; } if(getStartByte() == range->getStartByte() && (getEndByte() == 0 || getEndByte() > 0 && getEndByte() == range->getEndByte()) && (entityLength == 0 || entityLength > 0 && entityLength == range->getEntityLength())) { return true; } else { return false; } } std::string HttpRequest::getHostText(const std::string& host, int32_t port) const { return host+(port == 80 || port == 443 ? "" : ":"+Util::llitos(port)); } std::string HttpRequest::createRequest() const { std::string requestLine = "GET "; if(getProtocol() == "ftp" || proxyEnabled) { requestLine += getCurrentURI(); } else { if(getDir() == "/") { requestLine += getDir(); } else { requestLine += getDir()+"/"; } requestLine += getFile(); } requestLine += std::string(" HTTP/1.1\r\n")+ "User-Agent: "+userAgent+"\r\n"+ "Accept: */*\r\n"+ /* */ "Host: "+getHostText(getHost(), getPort())+"\r\n"+ "Pragma: no-cache\r\n"+ "Cache-Control: no-cache\r\n"; if(!request->isKeepAlive()) { requestLine += "Connection: close\r\n"; } if(!segment.isNull() && segment->getLength() > 0 && (request->isKeepAlive() || getStartByte() > 0)) { requestLine += "Range: bytes="+Util::llitos(getStartByte()); requestLine += "-"; if(request->isKeepAlive()) { requestLine += Util::llitos(getEndByte()); } requestLine += "\r\n"; } if(proxyEnabled) { if(request->isKeepAlive()) { requestLine += "Proxy-Connection: Keep-Alive\r\n"; } else { requestLine += "Proxy-Connection: close\r\n"; } } if(proxyEnabled && proxyAuthEnabled) { requestLine += getProxyAuthString(); } if(authEnabled) { requestLine += "Authorization: Basic "+ Base64::encode(AuthConfigFactorySingleton::instance()->createAuthConfig(request)->getAuthText())+"\r\n"; } if(getPreviousURI().size()) { requestLine += "Referer: "+getPreviousURI()+"\r\n"; } std::string cookiesValue; Cookies cookies = request->cookieBox->criteriaFind(getHost(), getDir(), time(0), getProtocol() == "https" ? true : false); for(Cookies::const_iterator itr = cookies.begin(); itr != cookies.end(); itr++) { cookiesValue += (*itr).toString()+";"; } if(cookiesValue.size()) { requestLine += std::string("Cookie: ")+cookiesValue+"\r\n"; } requestLine += "\r\n"; return requestLine; } std::string HttpRequest::createProxyRequest() const { std::string requestLine = std::string("CONNECT ")+getHost()+":"+Util::itos(getPort())+ std::string(" HTTP/1.1\r\n")+ "User-Agent: "+userAgent+"\r\n"+ "Host: "+getHost()+":"+Util::itos(getPort())+"\r\n"; if(request->isKeepAlive()) { requestLine += "Proxy-Connection: Keep-Alive\r\n"; }else { requestLine += "Proxy-Connection: close\r\n"; } if(proxyAuthEnabled) { requestLine += getProxyAuthString(); } requestLine += "\r\n"; return requestLine; } std::string HttpRequest::getProxyAuthString() const { return "Proxy-Authorization: Basic "+ Base64::encode(AuthConfigFactorySingleton::instance()->createAuthConfigForHttpProxy(request)->getAuthText())+"\r\n"; } void HttpRequest::configure(const Option* option) { authEnabled = option->get(PREF_HTTP_AUTH_ENABLED) == V_TRUE; proxyEnabled = option->get(PREF_HTTP_PROXY_ENABLED) == V_TRUE && option->get(PREF_HTTP_PROXY_METHOD) == V_GET; proxyAuthEnabled = option->get(PREF_HTTP_PROXY_AUTH_ENABLED) == V_TRUE; } std::string HttpRequest::getPreviousURI() const { return request->getPreviousUrl(); } std::string HttpRequest::getHost() const { return request->getHost(); } int32_t HttpRequest::getPort() const { return request->getPort(); } std::string HttpRequest::getMethod() const { return request->getMethod(); } std::string HttpRequest::getProtocol() const { return request->getProtocol(); } std::string HttpRequest::getCurrentURI() const { return request->getCurrentUrl(); } std::string HttpRequest::getDir() const { return request->getDir(); } std::string HttpRequest::getFile() const { return request->getFile(); } } // namespace aria2