/* */ #include "Request.h" #include "Util.h" #include "FeatureConfig.h" #include "CookieBoxFactory.h" const string Request::METHOD_GET = "get"; const string Request::METHOD_HEAD = "head"; Request::Request():port(0), tryCount(0), keepAlive(false), method(METHOD_GET), cookieBox(CookieBoxFactorySingletonHolder::instance()->createNewInstance()) {} Request::~Request() {} bool Request::setUrl(const string& url) { this->url = url; return parseUrl(url); } bool Request::resetUrl() { previousUrl = referer; return setUrl(url); } bool Request::redirectUrl(const string& url) { previousUrl = ""; keepAlive = false; return parseUrl(url); } bool Request::parseUrl(const string& url) { string tempUrl; string::size_type sharpIndex = url.find("#"); if(sharpIndex != string::npos) { if(FeatureConfig::getInstance()->isSupported("metalink") && url.find(METALINK_MARK) == sharpIndex) { tempUrl = url.substr(sharpIndex+strlen(METALINK_MARK)); } else { tempUrl = url.substr(0, sharpIndex); } } else { tempUrl = url; } currentUrl = tempUrl; string query; host = ""; port = 0; dir = ""; file = ""; _username = ""; _password = ""; if(tempUrl.find_first_not_of(SAFE_CHARS) != string::npos) { return false; } // find query part string::size_type startQueryIndex = tempUrl.find("?"); if(startQueryIndex != string::npos) { query = tempUrl.substr(startQueryIndex); tempUrl.erase(startQueryIndex); } // find protocol string::size_type hp = tempUrl.find("://"); if(hp == string::npos) return false; protocol = tempUrl.substr(0, hp); int32_t defPort; if((defPort = FeatureConfig::getInstance()->getDefaultPort(protocol)) == 0) { return false; } hp += 3; // find host part if(tempUrl.size() <= hp) return false; string::size_type hep = tempUrl.find("/", hp); if(hep == string::npos) { hep = tempUrl.size(); } string hostPart = tempUrl.substr(hp, hep-hp); // find username and password in host part if they exist string::size_type atmarkp = hostPart.find_last_of("@"); if(atmarkp != string::npos) { string authPart = hostPart.substr(0, atmarkp); pair userPass = Util::split(authPart, ":"); _username = Util::urldecode(userPass.first); _password = Util::urldecode(userPass.second); hostPart.erase(0, atmarkp+1); } pair hostAndPort; Util::split(hostAndPort, hostPart, ':'); host = hostAndPort.first; if(hostAndPort.second != "") { port = strtol(hostAndPort.second.c_str(), NULL, 10); if(!(0 < port && port <= 65535)) { return false; } } else { // If port is not specified, then we set it to default port of its protocol.. port = defPort; } // find directory and file part string::size_type direp = tempUrl.find_last_of("/"); if(direp == string::npos || direp <= hep) { dir = "/"; direp = hep; } else { string rawDir = tempUrl.substr(hep, direp-hep); string::size_type p = rawDir.find_first_not_of("/"); if(p != string::npos) { rawDir.erase(0, p-1); } p = rawDir.find_last_not_of("/"); if(p != string::npos) { rawDir.erase(p+1); } dir = rawDir; } if(tempUrl.size() > direp+1) { file = tempUrl.substr(direp+1); } file += query; return true; }