diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2006-02-18 16:31:41 +0000 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2006-02-18 16:31:41 +0000 |
| commit | b0628082d0ad183c953193da5c0cd38f5ede282d (patch) | |
| tree | 44f5b2594da0a17010a6e64182206dd5e711baeb /trunk/src/Request.cc | |
| parent | 81b2c9c6399505eba31e6096f43e6ce557a3a6ad (diff) | |
Tagging the 0.2.0 release of aria2
Diffstat (limited to 'trunk/src/Request.cc')
| -rw-r--r-- | trunk/src/Request.cc | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/trunk/src/Request.cc b/trunk/src/Request.cc new file mode 100644 index 00000000..b87cab1d --- /dev/null +++ b/trunk/src/Request.cc @@ -0,0 +1,116 @@ +/* <!-- copyright */ +/* + * aria2 - a simple utility for downloading files faster + * + * Copyright (C) 2006 Tatsuhiro Tsujikawa + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +/* copyright --> */ +#include "Request.h" +#include "Util.h" + +#define MAX_RETRY_COUNT 5 + +Request::Request():port(0), retryCount(0) { + defaultPorts["http"] = 80; +#ifdef HAVE_LIBSSL + // for SSL + defaultPorts["https"] = 443; +#endif // HAVE_LIBSSL + seg.sp = 0; + seg.ep = 0; + seg.ds = 0; + seg.finish = false; + cookieBox = new CookieBox(); +} + +Request::~Request() {} + +bool Request::setUrl(string url) { + this->url = url; + return parseUrl(url); +} + +bool Request::resetUrl() { + previousUrl = referer; + return setUrl(url); +} + +bool Request::redirectUrl(string url) { + previousUrl = currentUrl; + return parseUrl(url); +} + +bool Request::parseUrl(string url) { + currentUrl = url; + host = ""; + port = 0; + dir = ""; + file = ""; + if(url.find_first_not_of(SAFE_CHARS) != string::npos) { + return false; + } + string::size_type hp = url.find("://"); + if(hp == string::npos) return false; + protocol = url.substr(0, hp); + int defPort; + if((defPort = defaultPorts[protocol]) == 0) { + return false; + } + hp += 3; + if(url.size() <= hp) return false; + string::size_type hep = url.find("/", hp); + if(hep == string::npos) { + hep = url.size(); + } + pair<string, string> hostAndPort; + Util::split(hostAndPort, url.substr(hp, hep-hp), ':'); + host = hostAndPort.first; + if(hostAndPort.second != "") { + // TODO rewrite this using strtoul function. If strtoul fails, + // return false. + port = (int)strtol(hostAndPort.second.c_str(), NULL, 10); + if(!(0 < port && port <= 65535)) { + return false; + } + } else { + // If port is not specified, then we leave it 0. + port = defPort; + } + string::size_type direp = url.find_last_of("/"); + if(direp == string::npos || direp <= hep) { + dir = "/"; + direp = hep; + } else { + dir = url.substr(hep, direp-hep); + } + if(url.size() > direp+1) { + file = url.substr(direp+1); + } + return true; +} + +void Request::resetRetryCount() { + this->retryCount = 0; +} + +void Request::addRetryCount() { + retryCount++; +} + +bool Request::noMoreRetry() { + return retryCount >= MAX_RETRY_COUNT; +} |
