mirror of https://github.com/aria2/aria2
2010-03-07 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
url -> uri in Request class. * src/AbstractCommand.cc * src/AdaptiveURISelector.cc * src/DefaultBtAnnounce.cc * src/FeedbackURISelector.cc * src/FileEntry.cc * src/FileEntry.h * src/HttpRequest.h * src/HttpResponse.cc * src/InitiateConnectionCommandFactory.cc * src/Metalink2RequestGroup.cc * src/OptionHandlerImpl.h * src/ProtocolDetector.cc * src/Request.cc * src/Request.h * src/XmlRpcMethodImpl.cc * test/AuthConfigFactoryTest.cc * test/FtpConnectionTest.cc * test/HttpRequestTest.cc * test/HttpResponseTest.cc * test/RequestTest.ccpull/1/head
parent
6ce44b001d
commit
b0f180c99c
24
ChangeLog
24
ChangeLog
|
@ -1,3 +1,27 @@
|
|||
2010-03-07 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
|
||||
|
||||
url -> uri in Request class.
|
||||
* src/AbstractCommand.cc
|
||||
* src/AdaptiveURISelector.cc
|
||||
* src/DefaultBtAnnounce.cc
|
||||
* src/FeedbackURISelector.cc
|
||||
* src/FileEntry.cc
|
||||
* src/FileEntry.h
|
||||
* src/HttpRequest.h
|
||||
* src/HttpResponse.cc
|
||||
* src/InitiateConnectionCommandFactory.cc
|
||||
* src/Metalink2RequestGroup.cc
|
||||
* src/OptionHandlerImpl.h
|
||||
* src/ProtocolDetector.cc
|
||||
* src/Request.cc
|
||||
* src/Request.h
|
||||
* src/XmlRpcMethodImpl.cc
|
||||
* test/AuthConfigFactoryTest.cc
|
||||
* test/FtpConnectionTest.cc
|
||||
* test/HttpRequestTest.cc
|
||||
* test/HttpResponseTest.cc
|
||||
* test/RequestTest.cc
|
||||
|
||||
2010-03-07 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
|
||||
|
||||
Added getServers XML-RPC method.
|
||||
|
|
|
@ -111,7 +111,7 @@ bool AbstractCommand::execute() {
|
|||
if(logger->debug()) {
|
||||
logger->debug
|
||||
("CUID#%d - Discard original URI=%s because it is requested.",
|
||||
cuid, req->getUrl().c_str());
|
||||
cuid, req->getUri().c_str());
|
||||
}
|
||||
return prepareForRetry(0);
|
||||
}
|
||||
|
@ -208,10 +208,10 @@ bool AbstractCommand::execute() {
|
|||
} else {
|
||||
logger->error(MSG_DOWNLOAD_ABORTED,
|
||||
DL_ABORT_EX2(StringFormat
|
||||
("URI=%s", req->getCurrentUrl().c_str()).str(),err),
|
||||
cuid, req->getUrl().c_str());
|
||||
_fileEntry->addURIResult(req->getUrl(), err.getCode());
|
||||
_requestGroup->setLastUriResult(req->getUrl(), err.getCode());
|
||||
("URI=%s", req->getCurrentUri().c_str()).str(),err),
|
||||
cuid, req->getUri().c_str());
|
||||
_fileEntry->addURIResult(req->getUri(), err.getCode());
|
||||
_requestGroup->setLastUriResult(req->getUri(), err.getCode());
|
||||
}
|
||||
onAbort();
|
||||
tryReserved();
|
||||
|
@ -220,8 +220,8 @@ bool AbstractCommand::execute() {
|
|||
assert(!req.isNull());
|
||||
logger->info(MSG_RESTARTING_DOWNLOAD,
|
||||
DL_RETRY_EX2(StringFormat
|
||||
("URI=%s", req->getCurrentUrl().c_str()).str(),err),
|
||||
cuid, req->getUrl().c_str());
|
||||
("URI=%s", req->getCurrentUri().c_str()).str(),err),
|
||||
cuid, req->getUri().c_str());
|
||||
req->addTryCount();
|
||||
req->resetRedirectCount();
|
||||
const unsigned int maxTries = getOption()->getAsInt(PREF_MAX_TRIES);
|
||||
|
@ -229,9 +229,9 @@ bool AbstractCommand::execute() {
|
|||
if(isAbort) {
|
||||
onAbort();
|
||||
logger->info(MSG_MAX_TRY, cuid, req->getTryCount());
|
||||
logger->error(MSG_DOWNLOAD_ABORTED, err, cuid, req->getUrl().c_str());
|
||||
_fileEntry->addURIResult(req->getUrl(), err.getCode());
|
||||
_requestGroup->setLastUriResult(req->getUrl(), err.getCode());
|
||||
logger->error(MSG_DOWNLOAD_ABORTED, err, cuid, req->getUri().c_str());
|
||||
_fileEntry->addURIResult(req->getUri(), err.getCode());
|
||||
_requestGroup->setLastUriResult(req->getUri(), err.getCode());
|
||||
tryReserved();
|
||||
return true;
|
||||
} else {
|
||||
|
@ -240,8 +240,8 @@ bool AbstractCommand::execute() {
|
|||
} catch(DownloadFailureException& err) {
|
||||
logger->error(EX_EXCEPTION_CAUGHT, err);
|
||||
if(!req.isNull()) {
|
||||
_fileEntry->addURIResult(req->getUrl(), err.getCode());
|
||||
_requestGroup->setLastUriResult(req->getUrl(), err.getCode());
|
||||
_fileEntry->addURIResult(req->getUri(), err.getCode());
|
||||
_requestGroup->setLastUriResult(req->getUri(), err.getCode());
|
||||
}
|
||||
_requestGroup->setHaltRequested(true);
|
||||
return true;
|
||||
|
@ -281,7 +281,7 @@ bool AbstractCommand::prepareForRetry(time_t wait) {
|
|||
_fileEntry->poolRequest(req);
|
||||
if(logger->debug()) {
|
||||
logger->debug("CUID#%d - Pooling request URI=%s",
|
||||
cuid, req->getUrl().c_str());
|
||||
cuid, req->getUri().c_str());
|
||||
}
|
||||
if(!_requestGroup->getSegmentMan().isNull()) {
|
||||
_requestGroup->getSegmentMan()->recognizeSegmentFor(_fileEntry);
|
||||
|
@ -305,7 +305,7 @@ void AbstractCommand::onAbort() {
|
|||
// TODO This might be a problem if the failure is caused by proxy.
|
||||
e->_requestGroupMan->getOrCreateServerStat(req->getHost(),
|
||||
req->getProtocol())->setError();
|
||||
_fileEntry->removeIdenticalURI(req->getUrl());
|
||||
_fileEntry->removeIdenticalURI(req->getUri());
|
||||
_fileEntry->removeRequest(req);
|
||||
}
|
||||
if(logger->debug()) {
|
||||
|
@ -421,7 +421,7 @@ static bool isProxyRequest
|
|||
(const std::string& protocol, const SharedHandle<Option>& option)
|
||||
{
|
||||
const std::string& proxyUri = getProxyUri(protocol, option);
|
||||
return !proxyUri.empty() && Request().setUrl(proxyUri);
|
||||
return !proxyUri.empty() && Request().setUri(proxyUri);
|
||||
}
|
||||
|
||||
class DomainMatch {
|
||||
|
@ -468,7 +468,7 @@ SharedHandle<Request> AbstractCommand::createProxyRequest() const
|
|||
std::string proxy = getProxyUri(req->getProtocol(), getOption());
|
||||
if(!proxy.empty()) {
|
||||
proxyRequest.reset(new Request());
|
||||
if(proxyRequest->setUrl(proxy)) {
|
||||
if(proxyRequest->setUri(proxy)) {
|
||||
if(logger->debug()) {
|
||||
logger->debug("CUID#%d - Using proxy", cuid);
|
||||
}
|
||||
|
|
|
@ -341,7 +341,7 @@ SharedHandle<ServerStat> AdaptiveURISelector::getServerStats
|
|||
(const std::string& uri) const
|
||||
{
|
||||
Request r;
|
||||
r.setUrl(uri);
|
||||
r.setUri(uri);
|
||||
return _serverStatMan->find(r.getHost(), r.getProtocol());
|
||||
}
|
||||
|
||||
|
|
|
@ -108,7 +108,7 @@ bool DefaultBtAnnounce::isAnnounceReady() {
|
|||
static bool uriHasQuery(const std::string& uri)
|
||||
{
|
||||
Request req;
|
||||
req.setUrl(uri);
|
||||
req.setUri(uri);
|
||||
return !req.getQuery().empty();
|
||||
}
|
||||
|
||||
|
@ -141,50 +141,50 @@ std::string DefaultBtAnnounce::getAnnounceUrl() {
|
|||
TransferStat stat = peerStorage->calculateStat();
|
||||
uint64_t left =
|
||||
pieceStorage->getTotalLength()-pieceStorage->getCompletedLength();
|
||||
std::string url = announceList.getAnnounce();
|
||||
url += uriHasQuery(url) ? "&" : "?";
|
||||
url += "info_hash=";
|
||||
url += util::torrentUrlencode(bittorrent::getInfoHash(_downloadContext),
|
||||
std::string uri = announceList.getAnnounce();
|
||||
uri += uriHasQuery(uri) ? "&" : "?";
|
||||
uri += "info_hash=";
|
||||
uri += util::torrentUrlencode(bittorrent::getInfoHash(_downloadContext),
|
||||
INFO_HASH_LENGTH);
|
||||
url += "&peer_id=";
|
||||
url += util::torrentUrlencode(bittorrent::getStaticPeerId(), PEER_ID_LENGTH);
|
||||
url += "&uploaded=";
|
||||
url += util::uitos(stat.getSessionUploadLength());
|
||||
url += "&downloaded=";
|
||||
url += util::uitos(stat.getSessionDownloadLength());
|
||||
url += "&left=";
|
||||
url += util::uitos(left);
|
||||
url += "&compact=1";
|
||||
url += "&key=";
|
||||
uri += "&peer_id=";
|
||||
uri += util::torrentUrlencode(bittorrent::getStaticPeerId(), PEER_ID_LENGTH);
|
||||
uri += "&uploaded=";
|
||||
uri += util::uitos(stat.getSessionUploadLength());
|
||||
uri += "&downloaded=";
|
||||
uri += util::uitos(stat.getSessionDownloadLength());
|
||||
uri += "&left=";
|
||||
uri += util::uitos(left);
|
||||
uri += "&compact=1";
|
||||
uri += "&key=";
|
||||
// Use last 8 bytes of peer ID as a key
|
||||
size_t keyLen = 8;
|
||||
url += util::torrentUrlencode
|
||||
uri += util::torrentUrlencode
|
||||
(bittorrent::getStaticPeerId()+PEER_ID_LENGTH-keyLen, keyLen);
|
||||
url += "&numwant=";
|
||||
url += util::uitos(numWant);
|
||||
url += "&no_peer_id=1";
|
||||
uri += "&numwant=";
|
||||
uri += util::uitos(numWant);
|
||||
uri += "&no_peer_id=1";
|
||||
if(btRuntime->getListenPort() > 0) {
|
||||
url += "&port=";
|
||||
url += util::uitos(btRuntime->getListenPort());
|
||||
uri += "&port=";
|
||||
uri += util::uitos(btRuntime->getListenPort());
|
||||
}
|
||||
std::string event = announceList.getEventString();
|
||||
if(!event.empty()) {
|
||||
url += "&event=";
|
||||
url += event;
|
||||
uri += "&event=";
|
||||
uri += event;
|
||||
}
|
||||
if(!trackerId.empty()) {
|
||||
url += "&trackerid="+util::torrentUrlencode(trackerId);
|
||||
uri += "&trackerid="+util::torrentUrlencode(trackerId);
|
||||
}
|
||||
if(option->getAsBool(PREF_BT_REQUIRE_CRYPTO)) {
|
||||
url += "&requirecrypto=1";
|
||||
uri += "&requirecrypto=1";
|
||||
} else {
|
||||
url += "&supportcrypto=1";
|
||||
uri += "&supportcrypto=1";
|
||||
}
|
||||
if(!option->blank(PREF_BT_EXTERNAL_IP)) {
|
||||
url += "&ip=";
|
||||
url += option->get(PREF_BT_EXTERNAL_IP);
|
||||
uri += "&ip=";
|
||||
uri += option->get(PREF_BT_EXTERNAL_IP);
|
||||
}
|
||||
return url;
|
||||
return uri;
|
||||
}
|
||||
|
||||
void DefaultBtAnnounce::announceStart() {
|
||||
|
|
|
@ -76,7 +76,7 @@ std::string FeedbackURISelector::select(FileEntry* fileEntry)
|
|||
for(std::deque<std::string>::iterator i = uris.begin(), eoi = urisLast;
|
||||
i != eoi; ++i) {
|
||||
Request r;
|
||||
r.setUrl(*i);
|
||||
r.setUri(*i);
|
||||
SharedHandle<ServerStat> ss = _serverStatMan->find(r.getHost(),
|
||||
r.getProtocol());
|
||||
if(!ss.isNull() && ss->isOK() && ss->getDownloadSpeed() > SPEED_THRESHOLD) {
|
||||
|
@ -87,7 +87,7 @@ std::string FeedbackURISelector::select(FileEntry* fileEntry)
|
|||
for(std::deque<std::string>::iterator i = uris.begin(), eoi = uris.end();
|
||||
i != eoi; ++i) {
|
||||
Request r;
|
||||
r.setUrl(*i);
|
||||
r.setUri(*i);
|
||||
SharedHandle<ServerStat> ss = _serverStatMan->find(r.getHost(),
|
||||
r.getProtocol());
|
||||
// Skip ERROR state URI
|
||||
|
|
|
@ -132,7 +132,7 @@ FileEntry::getRequest
|
|||
return req;
|
||||
}
|
||||
req.reset(new Request());
|
||||
if(req->setUrl(uri)) {
|
||||
if(req->setUri(uri)) {
|
||||
if(!_singleHostMultiConnection) {
|
||||
if(inFlightHost(_inFlightRequests.begin(), _inFlightRequests.end(),
|
||||
req->getHost())) {
|
||||
|
@ -243,7 +243,7 @@ void FileEntry::removeURIWhoseHostnameIs(const std::string& hostname)
|
|||
for(std::deque<std::string>::const_iterator itr = _uris.begin(),
|
||||
eoi = _uris.end(); itr != eoi; ++itr) {
|
||||
if(((*itr).find(hostname) == std::string::npos) ||
|
||||
(req.setUrl(*itr) && (req.getHost() != hostname))) {
|
||||
(req.setUri(*itr) && (req.getHost() != hostname))) {
|
||||
newURIs.push_back(*itr);
|
||||
}
|
||||
}
|
||||
|
@ -337,7 +337,7 @@ static InputIterator findRequestByUri
|
|||
(InputIterator first, InputIterator last, const T& uri)
|
||||
{
|
||||
for(; first != last; ++first) {
|
||||
if(!(*first)->removalRequested() && (*first)->getUrl() == uri) {
|
||||
if(!(*first)->removalRequested() && (*first)->getUri() == uri) {
|
||||
return first;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -149,7 +149,7 @@ public:
|
|||
|
||||
bool addUri(const std::string& uri)
|
||||
{
|
||||
if(Request().setUrl(uri)) {
|
||||
if(Request().setUri(uri)) {
|
||||
_uris.push_back(uri);
|
||||
return true;
|
||||
} else {
|
||||
|
@ -159,7 +159,7 @@ public:
|
|||
|
||||
bool insertUri(const std::string& uri, size_t pos)
|
||||
{
|
||||
if(Request().setUrl(uri)) {
|
||||
if(Request().setUri(uri)) {
|
||||
pos = std::min(pos, _uris.size());
|
||||
_uris.insert(_uris.begin()+pos, uri);
|
||||
return true;
|
||||
|
|
|
@ -126,7 +126,7 @@ public:
|
|||
|
||||
const std::string& getCurrentURI() const
|
||||
{
|
||||
return request->getCurrentUrl();
|
||||
return request->getCurrentUri();
|
||||
}
|
||||
|
||||
const std::string& getDir() const
|
||||
|
@ -146,7 +146,7 @@ public:
|
|||
|
||||
const std::string& getPreviousURI() const
|
||||
{
|
||||
return request->getPreviousUrl();
|
||||
return request->getPreviousUri();
|
||||
}
|
||||
|
||||
std::string getURIHost() const
|
||||
|
@ -217,7 +217,7 @@ public:
|
|||
(const SharedHandle<AuthConfigFactory>& factory, const Option* option);
|
||||
|
||||
/*
|
||||
* To use proxy, pass proxy string to Request::setUrl() and set it this
|
||||
* To use proxy, pass proxy string to Request::setUri() and set it this
|
||||
* object.
|
||||
*/
|
||||
void setProxyRequest(const SharedHandle<Request>& proxyRequest);
|
||||
|
|
|
@ -132,14 +132,14 @@ bool HttpResponse::isRedirect() const
|
|||
void HttpResponse::processRedirect()
|
||||
{
|
||||
|
||||
if(httpRequest->getRequest()->redirectUrl(getRedirectURI())) {
|
||||
if(httpRequest->getRequest()->redirectUri(getRedirectURI())) {
|
||||
logger->info(MSG_REDIRECT, cuid,
|
||||
httpRequest->getRequest()->getCurrentUrl().c_str());
|
||||
httpRequest->getRequest()->getCurrentUri().c_str());
|
||||
} else {
|
||||
throw DL_RETRY_EX
|
||||
(StringFormat("CUID#%d - Redirect to %s failed. It may not be a valid"
|
||||
" URI.", cuid,
|
||||
httpRequest->getRequest()->getCurrentUrl().c_str()).str());
|
||||
httpRequest->getRequest()->getCurrentUri().c_str()).str());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -74,8 +74,8 @@ InitiateConnectionCommandFactory::createInitiateConnectionCommand
|
|||
} else if(req->getProtocol() == Request::PROTO_FTP) {
|
||||
if(req->getFile().empty()) {
|
||||
throw DL_ABORT_EX
|
||||
(StringFormat("FTP URL %s doesn't contain file path.",
|
||||
req->getUrl().c_str()).str());
|
||||
(StringFormat("FTP URI %s doesn't contain file path.",
|
||||
req->getUri().c_str()).str());
|
||||
}
|
||||
return
|
||||
new FtpInitiateConnectionCommand(cuid, req, fileEntry, requestGroup, e);
|
||||
|
|
|
@ -69,19 +69,19 @@ namespace aria2 {
|
|||
Metalink2RequestGroup::Metalink2RequestGroup():
|
||||
_logger(LogFactory::getInstance()) {}
|
||||
|
||||
class AccumulateNonP2PUrl {
|
||||
class AccumulateNonP2PUri {
|
||||
private:
|
||||
std::vector<std::string>& urlsPtr;
|
||||
std::vector<std::string>& urisPtr;
|
||||
public:
|
||||
AccumulateNonP2PUrl(std::vector<std::string>& urlsPtr)
|
||||
:urlsPtr(urlsPtr) {}
|
||||
AccumulateNonP2PUri(std::vector<std::string>& urisPtr)
|
||||
:urisPtr(urisPtr) {}
|
||||
|
||||
void operator()(const SharedHandle<MetalinkResource>& resource) {
|
||||
switch(resource->type) {
|
||||
case MetalinkResource::TYPE_HTTP:
|
||||
case MetalinkResource::TYPE_HTTPS:
|
||||
case MetalinkResource::TYPE_FTP:
|
||||
urlsPtr.push_back(resource->url);
|
||||
urisPtr.push_back(resource->url);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
@ -89,9 +89,9 @@ public:
|
|||
}
|
||||
};
|
||||
|
||||
class FindBitTorrentUrl {
|
||||
class FindBitTorrentUri {
|
||||
public:
|
||||
FindBitTorrentUrl() {}
|
||||
FindBitTorrentUri() {}
|
||||
|
||||
bool operator()(const SharedHandle<MetalinkResource>& resource) {
|
||||
if(resource->type == MetalinkResource::TYPE_BITTORRENT) {
|
||||
|
@ -232,7 +232,7 @@ Metalink2RequestGroup::createRequestGroup
|
|||
entry->reorderResourcesByPriority();
|
||||
std::vector<std::string> uris;
|
||||
std::for_each(entry->resources.begin(), entry->resources.end(),
|
||||
AccumulateNonP2PUrl(uris));
|
||||
AccumulateNonP2PUri(uris));
|
||||
// If piece hash is specified in the metalink,
|
||||
// make segment size equal to piece hash size.
|
||||
size_t pieceLength;
|
||||
|
@ -286,7 +286,7 @@ Metalink2RequestGroup::createRequestGroup
|
|||
(*i)->reorderResourcesByPriority();
|
||||
std::vector<std::string> uris;
|
||||
std::for_each((*i)->resources.begin(), (*i)->resources.end(),
|
||||
AccumulateNonP2PUrl(uris));
|
||||
AccumulateNonP2PUri(uris));
|
||||
SharedHandle<FileEntry> fe
|
||||
(new FileEntry
|
||||
(util::applyDir(option->get(PREF_DIR),
|
||||
|
|
|
@ -562,14 +562,14 @@ public:
|
|||
option.put(_optName, optarg);
|
||||
} else {
|
||||
Request req;
|
||||
std::string url;
|
||||
std::string uri;
|
||||
if(util::startsWith(optarg, "http://")) {
|
||||
url = optarg;
|
||||
uri = optarg;
|
||||
} else {
|
||||
url = "http://"+optarg;
|
||||
uri = "http://"+optarg;
|
||||
}
|
||||
if(req.setUrl(url)) {
|
||||
option.put(_optName, url);
|
||||
if(req.setUri(uri)) {
|
||||
option.put(_optName, uri);
|
||||
} else {
|
||||
throw DL_ABORT_EX(_("unrecognized proxy format"));
|
||||
}
|
||||
|
|
|
@ -53,7 +53,7 @@ ProtocolDetector::~ProtocolDetector() {}
|
|||
|
||||
bool ProtocolDetector::isStreamProtocol(const std::string& uri) const
|
||||
{
|
||||
return Request().setUrl(uri);
|
||||
return Request().setUri(uri);
|
||||
}
|
||||
|
||||
bool ProtocolDetector::guessTorrentFile(const std::string& uri) const
|
||||
|
|
|
@ -67,13 +67,13 @@ Request::Request():
|
|||
_removalRequested(false)
|
||||
{}
|
||||
|
||||
static std::string removeFragment(const std::string& url)
|
||||
static std::string removeFragment(const std::string& uri)
|
||||
{
|
||||
std::string::size_type sharpIndex = url.find("#");
|
||||
std::string::size_type sharpIndex = uri.find("#");
|
||||
if(sharpIndex == std::string::npos) {
|
||||
return url;
|
||||
return uri;
|
||||
} else {
|
||||
return url.substr(0, sharpIndex);
|
||||
return uri.substr(0, sharpIndex);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -83,7 +83,7 @@ static bool isHexNumber(const char c)
|
|||
('a' <= c && c <= 'f');
|
||||
}
|
||||
|
||||
static std::string urlencode(const std::string& src)
|
||||
static std::string percentEncode(const std::string& src)
|
||||
{
|
||||
std::string result = src;
|
||||
if(src.empty()) {
|
||||
|
@ -92,7 +92,7 @@ static std::string urlencode(const std::string& src)
|
|||
result += " ";
|
||||
for(int index = src.size()-1; index >= 0; --index) {
|
||||
const unsigned char c = result[index];
|
||||
// '/' is not urlencoded because src is expected to be a path.
|
||||
// '/' is not percent encoded because src is expected to be a path.
|
||||
if(!util::inRFC3986ReservedChars(c) && !util::inRFC3986UnreservedChars(c)) {
|
||||
if(c == '%') {
|
||||
if(!isHexNumber(result[index+1]) || !isHexNumber(result[index+2])) {
|
||||
|
@ -107,47 +107,47 @@ static std::string urlencode(const std::string& src)
|
|||
return result;
|
||||
}
|
||||
|
||||
bool Request::setUrl(const std::string& url) {
|
||||
bool Request::setUri(const std::string& uri) {
|
||||
_supportsPersistentConnection = true;
|
||||
_url = url;
|
||||
return parseUrl(_url);
|
||||
_uri = uri;
|
||||
return parseUri(_uri);
|
||||
}
|
||||
|
||||
bool Request::resetUrl() {
|
||||
_previousUrl = _referer;
|
||||
bool Request::resetUri() {
|
||||
_previousUri = _referer;
|
||||
_supportsPersistentConnection = true;
|
||||
return parseUrl(_url);
|
||||
return parseUri(_uri);
|
||||
}
|
||||
|
||||
void Request::setReferer(const std::string& url)
|
||||
void Request::setReferer(const std::string& uri)
|
||||
{
|
||||
_referer = _previousUrl = urlencode(removeFragment(url));
|
||||
_referer = _previousUri = percentEncode(removeFragment(uri));
|
||||
}
|
||||
|
||||
bool Request::redirectUrl(const std::string& url) {
|
||||
_previousUrl = A2STR::NIL;
|
||||
bool Request::redirectUri(const std::string& uri) {
|
||||
_previousUri = A2STR::NIL;
|
||||
_supportsPersistentConnection = true;
|
||||
++_redirectCount;
|
||||
std::string redirectedUrl;
|
||||
if(url.find("://") == std::string::npos) {
|
||||
std::string redirectedUri;
|
||||
if(uri.find("://") == std::string::npos) {
|
||||
// rfc2616 requires absolute URI should be provided by Location header
|
||||
// field, but some servers don't obey this rule.
|
||||
if(util::startsWith(url, "/")) {
|
||||
if(util::startsWith(uri, "/")) {
|
||||
// abosulute path
|
||||
redirectedUrl = strconcat(_protocol, "://", _host, url);
|
||||
redirectedUri = strconcat(_protocol, "://", _host, uri);
|
||||
} else {
|
||||
// relative path
|
||||
redirectedUrl = strconcat(_protocol, "://", _host, _dir, "/", url);
|
||||
redirectedUri = strconcat(_protocol, "://", _host, _dir, "/", uri);
|
||||
}
|
||||
} else {
|
||||
redirectedUrl = url;
|
||||
redirectedUri = uri;
|
||||
}
|
||||
return parseUrl(redirectedUrl);
|
||||
return parseUri(redirectedUri);
|
||||
}
|
||||
|
||||
bool Request::parseUrl(const std::string& srcUrl) {
|
||||
const std::string url = urlencode(removeFragment(srcUrl));
|
||||
_currentUrl = url;
|
||||
bool Request::parseUri(const std::string& srcUri) {
|
||||
const std::string uri = percentEncode(removeFragment(srcUri));
|
||||
_currentUri = uri;
|
||||
_host = A2STR::NIL;
|
||||
_port = 0;
|
||||
_dir = A2STR::NIL;
|
||||
|
@ -173,21 +173,21 @@ bool Request::parseUrl(const std::string& srcUrl) {
|
|||
// queryFirst
|
||||
|
||||
// find query part
|
||||
std::string::const_iterator queryFirst = url.begin();
|
||||
for(; queryFirst != url.end(); ++queryFirst) {
|
||||
std::string::const_iterator queryFirst = uri.begin();
|
||||
for(; queryFirst != uri.end(); ++queryFirst) {
|
||||
if(*queryFirst == '?') break;
|
||||
}
|
||||
_query = std::string(queryFirst, url.end());
|
||||
_query = std::string(queryFirst, uri.end());
|
||||
// find protocol
|
||||
std::string::size_type protocolOffset = url.find("://");
|
||||
std::string::size_type protocolOffset = uri.find("://");
|
||||
if(protocolOffset == std::string::npos) return false;
|
||||
_protocol = std::string(url.begin(), url.begin()+protocolOffset);
|
||||
_protocol = std::string(uri.begin(), uri.begin()+protocolOffset);
|
||||
uint16_t defPort;
|
||||
if((defPort = FeatureConfig::getInstance()->getDefaultPort(_protocol)) == 0) {
|
||||
return false;
|
||||
}
|
||||
// find authority
|
||||
std::string::const_iterator authorityFirst = url.begin()+protocolOffset+3;
|
||||
std::string::const_iterator authorityFirst = uri.begin()+protocolOffset+3;
|
||||
std::string::const_iterator authorityLast = authorityFirst;
|
||||
for(; authorityLast != queryFirst; ++authorityLast) {
|
||||
if(*authorityLast == '/') break;
|
||||
|
@ -318,7 +318,7 @@ const SharedHandle<PeerStat>& Request::initPeerStat()
|
|||
// Use host and protocol in original URI, because URI selector
|
||||
// selects URI based on original URI, not redirected one.
|
||||
Request origReq;
|
||||
origReq.setUrl(_url);
|
||||
origReq.setUri(_uri);
|
||||
_peerStat.reset(new PeerStat(0, origReq.getHost(), origReq.getProtocol()));
|
||||
return _peerStat;
|
||||
}
|
||||
|
|
|
@ -46,14 +46,14 @@ namespace aria2 {
|
|||
|
||||
class Request {
|
||||
private:
|
||||
std::string _url;
|
||||
std::string _currentUrl;
|
||||
std::string _uri;
|
||||
std::string _currentUri;
|
||||
/**
|
||||
* URL previously requested to the server. This is used as Referer
|
||||
* URI previously requested to the server. This is used as Referer
|
||||
*/
|
||||
std::string _previousUrl;
|
||||
std::string _previousUri;
|
||||
/**
|
||||
* URL used as Referer in the initial request
|
||||
* URI used as Referer in the initial request
|
||||
*/
|
||||
std::string _referer;
|
||||
std::string _protocol;
|
||||
|
@ -90,17 +90,17 @@ private:
|
|||
|
||||
bool _removalRequested;
|
||||
|
||||
bool parseUrl(const std::string& url);
|
||||
bool parseUri(const std::string& uri);
|
||||
public:
|
||||
Request();
|
||||
|
||||
// Sets url to _url and parses URL. Returns true if parsing goes
|
||||
// Sets uri to _uri and parses URI. Returns true if parsing goes
|
||||
// successful, otherwise returns false.
|
||||
bool setUrl(const std::string& url);
|
||||
// Parses URL. _url field are not altered by this method. Returns
|
||||
bool setUri(const std::string& uri);
|
||||
// Parses URI. _uri field are not altered by this method. Returns
|
||||
// true if parsing goes successful, otherwise returns false.
|
||||
bool redirectUrl(const std::string& url);
|
||||
bool resetUrl();
|
||||
bool redirectUri(const std::string& uri);
|
||||
bool resetUri();
|
||||
void resetTryCount() { _tryCount = 0; }
|
||||
void addTryCount() { ++_tryCount; }
|
||||
unsigned int getTryCount() const { return _tryCount; }
|
||||
|
@ -112,12 +112,12 @@ public:
|
|||
return _redirectCount;
|
||||
}
|
||||
|
||||
// Returns URI passed by setUrl()
|
||||
const std::string& getUrl() const { return _url; }
|
||||
const std::string& getCurrentUrl() const { return _currentUrl; }
|
||||
const std::string& getPreviousUrl() const { return _previousUrl; }
|
||||
// Returns URI passed by setUri()
|
||||
const std::string& getUri() const { return _uri; }
|
||||
const std::string& getCurrentUri() const { return _currentUri; }
|
||||
const std::string& getPreviousUri() const { return _previousUri; }
|
||||
const std::string& getReferer() const { return _referer; }
|
||||
void setReferer(const std::string& url);
|
||||
void setReferer(const std::string& uri);
|
||||
const std::string& getProtocol() const { return _protocol; }
|
||||
const std::string& getHost() const { return _host; }
|
||||
// Same as getHost(), but for IPv6 literal addresses, enclose them
|
||||
|
|
|
@ -912,8 +912,8 @@ BDE GetServersXmlRpcMethod::process
|
|||
SharedHandle<PeerStat> ps = (*ri)->getPeerStat();
|
||||
if(!ps.isNull()) {
|
||||
BDE serverEntry = BDE::dict();
|
||||
serverEntry[KEY_URI] = (*ri)->getUrl();
|
||||
serverEntry[KEY_CURRENT_URI] = (*ri)->getCurrentUrl();
|
||||
serverEntry[KEY_URI] = (*ri)->getUri();
|
||||
serverEntry[KEY_CURRENT_URI] = (*ri)->getCurrentUri();
|
||||
serverEntry[KEY_DOWNLOAD_SPEED] =
|
||||
util::uitos(ps->calculateDownloadSpeed());
|
||||
servers << serverEntry;
|
||||
|
|
|
@ -32,7 +32,7 @@ CPPUNIT_TEST_SUITE_REGISTRATION( AuthConfigFactoryTest );
|
|||
void AuthConfigFactoryTest::testCreateAuthConfig_http()
|
||||
{
|
||||
SharedHandle<Request> req(new Request());
|
||||
req->setUrl("http://localhost/download/aria2-1.0.0.tar.bz2");
|
||||
req->setUri("http://localhost/download/aria2-1.0.0.tar.bz2");
|
||||
|
||||
Option option;
|
||||
option.put(PREF_NO_NETRC, V_FALSE);
|
||||
|
@ -63,7 +63,7 @@ void AuthConfigFactoryTest::testCreateAuthConfig_http()
|
|||
factory.createAuthConfig(req, &option)->getAuthText());
|
||||
|
||||
// See default token in netrc is ignored.
|
||||
req->setUrl("http://mirror/");
|
||||
req->setUri("http://mirror/");
|
||||
|
||||
CPPUNIT_ASSERT(!factory.activateBasicCred("mirror", "/", &option));
|
||||
|
||||
|
@ -81,7 +81,7 @@ void AuthConfigFactoryTest::testCreateAuthConfig_http()
|
|||
factory.createAuthConfig(req, &option)->getAuthText());
|
||||
|
||||
// username and password in URI
|
||||
req->setUrl("http://aria2user:aria2password@localhost/download/aria2-1.0.0.tar.bz2");
|
||||
req->setUri("http://aria2user:aria2password@localhost/download/aria2-1.0.0.tar.bz2");
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("aria2user:aria2password"),
|
||||
factory.createAuthConfig(req, &option)->getAuthText());
|
||||
}
|
||||
|
@ -89,7 +89,7 @@ void AuthConfigFactoryTest::testCreateAuthConfig_http()
|
|||
void AuthConfigFactoryTest::testCreateAuthConfig_httpNoChallenge()
|
||||
{
|
||||
SharedHandle<Request> req(new Request());
|
||||
req->setUrl("http://localhost/download/aria2-1.0.0.tar.bz2");
|
||||
req->setUri("http://localhost/download/aria2-1.0.0.tar.bz2");
|
||||
|
||||
Option option;
|
||||
option.put(PREF_NO_NETRC, V_FALSE);
|
||||
|
@ -115,7 +115,7 @@ void AuthConfigFactoryTest::testCreateAuthConfig_httpNoChallenge()
|
|||
factory.createAuthConfig(req, &option)->getAuthText());
|
||||
|
||||
// See default token in netrc is ignored.
|
||||
req->setUrl("http://mirror/");
|
||||
req->setUri("http://mirror/");
|
||||
|
||||
CPPUNIT_ASSERT(factory.createAuthConfig(req, &option).isNull());
|
||||
|
||||
|
@ -127,7 +127,7 @@ void AuthConfigFactoryTest::testCreateAuthConfig_httpNoChallenge()
|
|||
factory.createAuthConfig(req, &option)->getAuthText());
|
||||
|
||||
// username and password in URI
|
||||
req->setUrl("http://aria2user:aria2password@localhost/download/aria2-1.0.0.tar.bz2");
|
||||
req->setUri("http://aria2user:aria2password@localhost/download/aria2-1.0.0.tar.bz2");
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("aria2user:aria2password"),
|
||||
factory.createAuthConfig(req, &option)->getAuthText());
|
||||
}
|
||||
|
@ -135,7 +135,7 @@ void AuthConfigFactoryTest::testCreateAuthConfig_httpNoChallenge()
|
|||
void AuthConfigFactoryTest::testCreateAuthConfig_ftp()
|
||||
{
|
||||
SharedHandle<Request> req(new Request());
|
||||
req->setUrl("ftp://localhost/download/aria2-1.0.0.tar.bz2");
|
||||
req->setUri("ftp://localhost/download/aria2-1.0.0.tar.bz2");
|
||||
|
||||
Option option;
|
||||
option.put(PREF_NO_NETRC, V_FALSE);
|
||||
|
@ -167,13 +167,13 @@ void AuthConfigFactoryTest::testCreateAuthConfig_ftp()
|
|||
factory.createAuthConfig(req, &option)->getAuthText());
|
||||
|
||||
// username and password in URI
|
||||
req->setUrl("ftp://aria2user:aria2password@localhost/download/aria2-1.0.0.tar.bz2");
|
||||
req->setUri("ftp://aria2user:aria2password@localhost/download/aria2-1.0.0.tar.bz2");
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("aria2user:aria2password"),
|
||||
factory.createAuthConfig(req, &option)->getAuthText());
|
||||
|
||||
// username in URI, but no password. We have DefaultAuthenticator
|
||||
// but username is not aria2user
|
||||
req->setUrl("ftp://aria2user@localhost/download/aria2-1.0.0.tar.bz2");
|
||||
req->setUri("ftp://aria2user@localhost/download/aria2-1.0.0.tar.bz2");
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("aria2user:userDefinedPassword"),
|
||||
factory.createAuthConfig(req, &option)->getAuthText());
|
||||
|
||||
|
@ -190,7 +190,7 @@ void AuthConfigFactoryTest::testCreateAuthConfig_ftp()
|
|||
CPPUNIT_ASSERT_EQUAL(std::string("aria2user:netrcpass"),
|
||||
factory.createAuthConfig(req, &option)->getAuthText());
|
||||
// No netrc entry for host mirror, so "userDefinedPassword" is used.
|
||||
req->setUrl("ftp://aria2user@mirror/download/aria2-1.0.0.tar.bz2");
|
||||
req->setUri("ftp://aria2user@mirror/download/aria2-1.0.0.tar.bz2");
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("aria2user:userDefinedPassword"),
|
||||
factory.createAuthConfig(req, &option)->getAuthText());
|
||||
}
|
||||
|
@ -213,27 +213,27 @@ void AuthConfigFactoryTest::testUpdateBasicCred()
|
|||
(AuthConfigFactory::BasicCred("jack", "jackx","mirror", "/doc", true));
|
||||
|
||||
SharedHandle<Request> req(new Request());
|
||||
req->setUrl("http://localhost/download/v2.6/Changelog");
|
||||
req->setUri("http://localhost/download/v2.6/Changelog");
|
||||
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("price:j38jdc"),
|
||||
factory.createAuthConfig(req, &option)->getAuthText());
|
||||
|
||||
req->setUrl("http://localhost/documents/reference.html");
|
||||
req->setUri("http://localhost/documents/reference.html");
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("alice:ium8"),
|
||||
factory.createAuthConfig(req, &option)->getAuthText());
|
||||
|
||||
req->setUrl("http://localhost/documents2/manual.html");
|
||||
req->setUri("http://localhost/documents2/manual.html");
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("myname:mypass"),
|
||||
factory.createAuthConfig(req, &option)->getAuthText());
|
||||
|
||||
req->setUrl("http://localhost/doc/readme.txt");
|
||||
req->setUri("http://localhost/doc/readme.txt");
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("myname:mypass"),
|
||||
factory.createAuthConfig(req, &option)->getAuthText());
|
||||
|
||||
req->setUrl("http://local/");
|
||||
req->setUri("http://local/");
|
||||
CPPUNIT_ASSERT(factory.createAuthConfig(req, &option).isNull());
|
||||
|
||||
req->setUrl("http://mirror/");
|
||||
req->setUri("http://mirror/");
|
||||
CPPUNIT_ASSERT(factory.createAuthConfig(req, &option).isNull());
|
||||
}
|
||||
|
||||
|
|
|
@ -54,7 +54,7 @@ public:
|
|||
_listenPort = addrinfo.second;
|
||||
|
||||
SharedHandle<Request> req(new Request());
|
||||
req->setUrl("ftp://localhost/dir/file.img");
|
||||
req->setUri("ftp://localhost/dir/file.img");
|
||||
|
||||
_clientSocket.reset(new SocketCore());
|
||||
_clientSocket->establishConnection("localhost", _listenPort);
|
||||
|
|
|
@ -126,7 +126,7 @@ void HttpRequestTest::testCreateRequest()
|
|||
SharedHandle<Request> request(new Request());
|
||||
request->supportsPersistentConnection(true);
|
||||
|
||||
request->setUrl("http://localhost:8080/archives/aria2-1.0.0.tar.bz2");
|
||||
request->setUri("http://localhost:8080/archives/aria2-1.0.0.tar.bz2");
|
||||
|
||||
p.reset(new Piece(0, 1024));
|
||||
SharedHandle<Segment> segment(new PiecedSegment(1024, p));
|
||||
|
@ -196,7 +196,7 @@ void HttpRequestTest::testCreateRequest()
|
|||
CPPUNIT_ASSERT_EQUAL(expectedText, httpRequest.createRequest());
|
||||
|
||||
// redirection set persistent connection flag to true
|
||||
request->redirectUrl("http://localhost:8080/archives/download/aria2-1.0.0.tar.bz2");
|
||||
request->redirectUri("http://localhost:8080/archives/download/aria2-1.0.0.tar.bz2");
|
||||
|
||||
expectedText = "GET /archives/download/aria2-1.0.0.tar.bz2 HTTP/1.1\r\n"
|
||||
"User-Agent: aria2\r\n"
|
||||
|
@ -228,7 +228,7 @@ void HttpRequestTest::testCreateRequest()
|
|||
|
||||
request->setKeepAliveHint(false);
|
||||
|
||||
request->resetUrl();
|
||||
request->resetUri();
|
||||
|
||||
p.reset(new Piece(0, 1024*1024));
|
||||
segment.reset(new PiecedSegment(1024*1024, p));
|
||||
|
@ -255,7 +255,7 @@ void HttpRequestTest::testCreateRequest()
|
|||
|
||||
// enable http proxy auth
|
||||
SharedHandle<Request> proxyRequest(new Request());
|
||||
CPPUNIT_ASSERT(proxyRequest->setUrl
|
||||
CPPUNIT_ASSERT(proxyRequest->setUri
|
||||
("http://aria2proxyuser:aria2proxypasswd@localhost:9000"));
|
||||
httpRequest.setProxyRequest(proxyRequest);
|
||||
|
||||
|
@ -292,7 +292,7 @@ void HttpRequestTest::testCreateRequest()
|
|||
request->setPipeliningHint(false);
|
||||
|
||||
// turn off proxy auth
|
||||
CPPUNIT_ASSERT(proxyRequest->setUrl("http://localhost:9000"));
|
||||
CPPUNIT_ASSERT(proxyRequest->setUri("http://localhost:9000"));
|
||||
|
||||
expectedText = "GET http://localhost:8080/archives/aria2-1.0.0.tar.bz2 HTTP/1.1\r\n"
|
||||
"User-Agent: aria2\r\n"
|
||||
|
@ -314,10 +314,10 @@ void HttpRequestTest::testCreateRequest_ftp()
|
|||
_option->put(PREF_FTP_PASSWD, "aria2passwd");
|
||||
|
||||
SharedHandle<Request> request(new Request());
|
||||
request->setUrl("ftp://localhost:8080/archives/aria2-1.0.0.tar.bz2");
|
||||
request->setUri("ftp://localhost:8080/archives/aria2-1.0.0.tar.bz2");
|
||||
|
||||
SharedHandle<Request> proxyRequest(new Request());
|
||||
CPPUNIT_ASSERT(proxyRequest->setUrl
|
||||
CPPUNIT_ASSERT(proxyRequest->setUri
|
||||
("http://localhost:9000"));
|
||||
|
||||
HttpRequest httpRequest;
|
||||
|
@ -349,7 +349,7 @@ void HttpRequestTest::testCreateRequest_ftp()
|
|||
CPPUNIT_ASSERT_EQUAL(expectedText, httpRequest.createRequest());
|
||||
|
||||
// test proxy authorization
|
||||
CPPUNIT_ASSERT(proxyRequest->setUrl
|
||||
CPPUNIT_ASSERT(proxyRequest->setUri
|
||||
("http://aria2proxyuser:aria2proxypasswd@localhost:9000"));
|
||||
|
||||
expectedText =
|
||||
|
@ -372,7 +372,7 @@ void HttpRequestTest::testCreateRequest_ftp()
|
|||
void HttpRequestTest::testCreateRequest_with_cookie()
|
||||
{
|
||||
SharedHandle<Request> request(new Request());
|
||||
request->setUrl("http://localhost/archives/aria2-1.0.0.tar.bz2");
|
||||
request->setUri("http://localhost/archives/aria2-1.0.0.tar.bz2");
|
||||
SharedHandle<Piece> p(new Piece(0, 1024*1024));
|
||||
SharedHandle<Segment> segment
|
||||
(new PiecedSegment(1024*1024, p));
|
||||
|
@ -410,7 +410,7 @@ void HttpRequestTest::testCreateRequest_with_cookie()
|
|||
|
||||
CPPUNIT_ASSERT_EQUAL(expectedText, httpRequest.createRequest());
|
||||
|
||||
request->setUrl("http://localhost/archives/download/aria2-1.0.0.tar.bz2");
|
||||
request->setUri("http://localhost/archives/download/aria2-1.0.0.tar.bz2");
|
||||
|
||||
expectedText = "GET /archives/download/aria2-1.0.0.tar.bz2 HTTP/1.1\r\n"
|
||||
"User-Agent: aria2\r\n"
|
||||
|
@ -424,7 +424,7 @@ void HttpRequestTest::testCreateRequest_with_cookie()
|
|||
|
||||
CPPUNIT_ASSERT_EQUAL(expectedText, httpRequest.createRequest());
|
||||
|
||||
request->setUrl("http://www.aria2.org/archives/download/aria2-1.0.0.tar.bz2");
|
||||
request->setUri("http://www.aria2.org/archives/download/aria2-1.0.0.tar.bz2");
|
||||
|
||||
expectedText = "GET /archives/download/aria2-1.0.0.tar.bz2 HTTP/1.1\r\n"
|
||||
"User-Agent: aria2\r\n"
|
||||
|
@ -438,7 +438,7 @@ void HttpRequestTest::testCreateRequest_with_cookie()
|
|||
|
||||
CPPUNIT_ASSERT_EQUAL(expectedText, httpRequest.createRequest());
|
||||
|
||||
request->setUrl("https://www.aria2.org/archives/download/"
|
||||
request->setUri("https://www.aria2.org/archives/download/"
|
||||
"aria2-1.0.0.tar.bz2");
|
||||
|
||||
expectedText = "GET /archives/download/aria2-1.0.0.tar.bz2 HTTP/1.1\r\n"
|
||||
|
@ -458,7 +458,7 @@ void HttpRequestTest::testCreateRequest_with_cookie()
|
|||
void HttpRequestTest::testCreateRequest_query()
|
||||
{
|
||||
SharedHandle<Request> request(new Request());
|
||||
request->setUrl("http://localhost/wiki?id=9ad5109a-b8a5-4edf-9373-56a1c34ae138");
|
||||
request->setUri("http://localhost/wiki?id=9ad5109a-b8a5-4edf-9373-56a1c34ae138");
|
||||
HttpRequest httpRequest;
|
||||
httpRequest.disableContentEncoding();
|
||||
httpRequest.setRequest(request);
|
||||
|
@ -481,7 +481,7 @@ void HttpRequestTest::testCreateRequest_head()
|
|||
{
|
||||
SharedHandle<Request> request(new Request());
|
||||
request->setMethod(Request::METHOD_HEAD);
|
||||
request->setUrl("http://localhost/aria2-1.0.0.tar.bz2");
|
||||
request->setUri("http://localhost/aria2-1.0.0.tar.bz2");
|
||||
|
||||
HttpRequest httpRequest;
|
||||
httpRequest.setRequest(request);
|
||||
|
@ -497,12 +497,12 @@ void HttpRequestTest::testCreateRequest_head()
|
|||
void HttpRequestTest::testCreateProxyRequest()
|
||||
{
|
||||
SharedHandle<Request> request(new Request());
|
||||
request->setUrl("http://localhost/archives/aria2-1.0.0.tar.bz2");
|
||||
request->setUri("http://localhost/archives/aria2-1.0.0.tar.bz2");
|
||||
SharedHandle<Piece> p(new Piece(0, 1024*1024));
|
||||
SharedHandle<Segment> segment(new PiecedSegment(1024*1024, p));
|
||||
|
||||
SharedHandle<Request> proxyRequest(new Request());
|
||||
CPPUNIT_ASSERT(proxyRequest->setUrl("http://localhost:9000"));
|
||||
CPPUNIT_ASSERT(proxyRequest->setUri("http://localhost:9000"));
|
||||
|
||||
HttpRequest httpRequest;
|
||||
|
||||
|
@ -544,7 +544,7 @@ void HttpRequestTest::testCreateProxyRequest()
|
|||
CPPUNIT_ASSERT_EQUAL(expectedText, httpRequest.createProxyRequest());
|
||||
|
||||
// test proxy authorization
|
||||
CPPUNIT_ASSERT(proxyRequest->setUrl
|
||||
CPPUNIT_ASSERT(proxyRequest->setUri
|
||||
("http://aria2proxyuser:aria2proxypasswd@localhost:9000"));
|
||||
|
||||
expectedText = "CONNECT localhost:80 HTTP/1.1\r\n"
|
||||
|
@ -561,7 +561,7 @@ void HttpRequestTest::testIsRangeSatisfied()
|
|||
{
|
||||
SharedHandle<Request> request(new Request());
|
||||
request->supportsPersistentConnection(true);
|
||||
request->setUrl("http://localhost:8080/archives/aria2-1.0.0.tar.bz2");
|
||||
request->setUri("http://localhost:8080/archives/aria2-1.0.0.tar.bz2");
|
||||
request->setPipeliningHint(false); // default: false
|
||||
SharedHandle<Piece> p(new Piece(0, 1024*1024));
|
||||
SharedHandle<Segment> segment(new PiecedSegment(1024*1024, p));
|
||||
|
@ -616,7 +616,7 @@ void HttpRequestTest::testIsRangeSatisfied()
|
|||
void HttpRequestTest::testUserAgent()
|
||||
{
|
||||
SharedHandle<Request> request(new Request());
|
||||
request->setUrl("http://localhost:8080/archives/aria2-1.0.0.tar.bz2");
|
||||
request->setUri("http://localhost:8080/archives/aria2-1.0.0.tar.bz2");
|
||||
|
||||
//SharedHandle<Piece> p(new Piece(0, 1024));
|
||||
//SharedHandle<Segment> segment(new PiecedSegment(1024, p));
|
||||
|
@ -640,7 +640,7 @@ void HttpRequestTest::testUserAgent()
|
|||
CPPUNIT_ASSERT_EQUAL(expectedText, httpRequest.createRequest());
|
||||
|
||||
SharedHandle<Request> proxyRequest(new Request());
|
||||
CPPUNIT_ASSERT(proxyRequest->setUrl("http://localhost:9000"));
|
||||
CPPUNIT_ASSERT(proxyRequest->setUri("http://localhost:9000"));
|
||||
|
||||
httpRequest.setProxyRequest(proxyRequest);
|
||||
|
||||
|
@ -656,7 +656,7 @@ void HttpRequestTest::testUserAgent()
|
|||
void HttpRequestTest::testAddHeader()
|
||||
{
|
||||
SharedHandle<Request> request(new Request());
|
||||
request->setUrl("http://localhost/archives/aria2-1.0.0.tar.bz2");
|
||||
request->setUri("http://localhost/archives/aria2-1.0.0.tar.bz2");
|
||||
|
||||
HttpRequest httpRequest;
|
||||
httpRequest.disableContentEncoding();
|
||||
|
@ -684,7 +684,7 @@ void HttpRequestTest::testAddAcceptType()
|
|||
"muffin/chocolate" };
|
||||
|
||||
SharedHandle<Request> request(new Request());
|
||||
request->setUrl("http://localhost/archives/aria2-1.0.0.tar.bz2");
|
||||
request->setUri("http://localhost/archives/aria2-1.0.0.tar.bz2");
|
||||
|
||||
HttpRequest httpRequest;
|
||||
httpRequest.disableContentEncoding();
|
||||
|
@ -709,7 +709,7 @@ void HttpRequestTest::testAddAcceptType()
|
|||
void HttpRequestTest::testEnableAcceptEncoding()
|
||||
{
|
||||
SharedHandle<Request> request(new Request());
|
||||
request->setUrl("http://localhost/archives/aria2-1.0.0.tar.bz2");
|
||||
request->setUri("http://localhost/archives/aria2-1.0.0.tar.bz2");
|
||||
|
||||
HttpRequest httpRequest;
|
||||
httpRequest.setRequest(request);
|
||||
|
@ -740,7 +740,7 @@ void HttpRequestTest::testEnableAcceptEncoding()
|
|||
void HttpRequestTest::testCreateRequest_ipv6LiteralAddr()
|
||||
{
|
||||
SharedHandle<Request> request(new Request());
|
||||
request->setUrl("http://[::1]/path");
|
||||
request->setUri("http://[::1]/path");
|
||||
HttpRequest httpRequest;
|
||||
httpRequest.disableContentEncoding();
|
||||
httpRequest.setRequest(request);
|
||||
|
@ -749,7 +749,7 @@ void HttpRequestTest::testCreateRequest_ipv6LiteralAddr()
|
|||
CPPUNIT_ASSERT(httpRequest.createRequest().find("Host: [::1]") != std::string::npos);
|
||||
|
||||
SharedHandle<Request> proxy(new Request());
|
||||
proxy->setUrl("http://proxy");
|
||||
proxy->setUri("http://proxy");
|
||||
httpRequest.setProxyRequest(proxy);
|
||||
std::string proxyRequest = httpRequest.createProxyRequest();
|
||||
CPPUNIT_ASSERT(proxyRequest.find("Host: [::1]:80") != std::string::npos);
|
||||
|
|
|
@ -137,7 +137,7 @@ void HttpResponseTest::testDeterminFilename_without_ContentDisposition()
|
|||
SharedHandle<HttpHeader> httpHeader(new HttpHeader());
|
||||
SharedHandle<HttpRequest> httpRequest(new HttpRequest());
|
||||
SharedHandle<Request> request(new Request());
|
||||
request->setUrl("http://localhost/archives/aria2-1.0.0.tar.bz2");
|
||||
request->setUri("http://localhost/archives/aria2-1.0.0.tar.bz2");
|
||||
httpRequest->setRequest(request);
|
||||
|
||||
httpResponse.setHttpHeader(httpHeader);
|
||||
|
@ -155,7 +155,7 @@ void HttpResponseTest::testDeterminFilename_with_ContentDisposition_zero_length
|
|||
httpHeader->put("Content-Disposition", "attachment; filename=\"\"");
|
||||
SharedHandle<HttpRequest> httpRequest(new HttpRequest());
|
||||
SharedHandle<Request> request(new Request());
|
||||
request->setUrl("http://localhost/archives/aria2-1.0.0.tar.bz2");
|
||||
request->setUri("http://localhost/archives/aria2-1.0.0.tar.bz2");
|
||||
httpRequest->setRequest(request);
|
||||
|
||||
httpResponse.setHttpHeader(httpHeader);
|
||||
|
@ -173,7 +173,7 @@ void HttpResponseTest::testDeterminFilename_with_ContentDisposition()
|
|||
"attachment; filename=\"aria2-current.tar.bz2\"");
|
||||
SharedHandle<HttpRequest> httpRequest(new HttpRequest());
|
||||
SharedHandle<Request> request(new Request());
|
||||
request->setUrl("http://localhost/archives/aria2-1.0.0.tar.bz2");
|
||||
request->setUri("http://localhost/archives/aria2-1.0.0.tar.bz2");
|
||||
httpRequest->setRequest(request);
|
||||
|
||||
httpResponse.setHttpHeader(httpHeader);
|
||||
|
@ -362,7 +362,7 @@ void HttpResponseTest::testValidateResponse_good_range()
|
|||
SharedHandle<FileEntry> fileEntry(new FileEntry("file", 1024*1024*10, 0));
|
||||
httpRequest->setFileEntry(fileEntry);
|
||||
SharedHandle<Request> request(new Request());
|
||||
request->setUrl("http://localhost/archives/aria2-1.0.0.tar.bz2");
|
||||
request->setUri("http://localhost/archives/aria2-1.0.0.tar.bz2");
|
||||
httpRequest->setRequest(request);
|
||||
httpResponse.setHttpRequest(httpRequest);
|
||||
httpHeader->setResponseStatus("206");
|
||||
|
@ -389,7 +389,7 @@ void HttpResponseTest::testValidateResponse_bad_range()
|
|||
SharedHandle<FileEntry> fileEntry(new FileEntry("file", 1024*1024*10, 0));
|
||||
httpRequest->setFileEntry(fileEntry);
|
||||
SharedHandle<Request> request(new Request());
|
||||
request->setUrl("http://localhost/archives/aria2-1.0.0.tar.bz2");
|
||||
request->setUri("http://localhost/archives/aria2-1.0.0.tar.bz2");
|
||||
httpRequest->setRequest(request);
|
||||
httpResponse.setHttpRequest(httpRequest);
|
||||
httpHeader->setResponseStatus("206");
|
||||
|
@ -415,7 +415,7 @@ void HttpResponseTest::testValidateResponse_chunked()
|
|||
SharedHandle<FileEntry> fileEntry(new FileEntry("file", 1024*1024*10, 0));
|
||||
httpRequest->setFileEntry(fileEntry);
|
||||
SharedHandle<Request> request(new Request());
|
||||
request->setUrl("http://localhost/archives/aria2-1.0.0.tar.bz2");
|
||||
request->setUri("http://localhost/archives/aria2-1.0.0.tar.bz2");
|
||||
httpRequest->setRequest(request);
|
||||
httpResponse.setHttpRequest(httpRequest);
|
||||
httpHeader->setResponseStatus("206");
|
||||
|
@ -450,7 +450,7 @@ void HttpResponseTest::testProcessRedirect()
|
|||
|
||||
SharedHandle<HttpRequest> httpRequest(new HttpRequest());
|
||||
SharedHandle<Request> request(new Request());
|
||||
request->setUrl("http://localhost/archives/aria2-1.0.0.tar.bz2");
|
||||
request->setUri("http://localhost/archives/aria2-1.0.0.tar.bz2");
|
||||
httpRequest->setRequest(request);
|
||||
httpResponse.setHttpRequest(httpRequest);
|
||||
|
||||
|
@ -479,7 +479,7 @@ void HttpResponseTest::testRetrieveCookie()
|
|||
|
||||
SharedHandle<HttpRequest> httpRequest(new HttpRequest());
|
||||
SharedHandle<Request> request(new Request());
|
||||
request->setUrl("http://www.aria2.org/archives/aria2-1.0.0.tar.bz2");
|
||||
request->setUri("http://www.aria2.org/archives/aria2-1.0.0.tar.bz2");
|
||||
httpRequest->setRequest(request);
|
||||
SharedHandle<CookieStorage> st(new CookieStorage());
|
||||
httpRequest->setCookieStorage(st);
|
||||
|
|
|
@ -11,72 +11,72 @@ namespace aria2 {
|
|||
class RequestTest:public CppUnit::TestFixture {
|
||||
|
||||
CPPUNIT_TEST_SUITE(RequestTest);
|
||||
CPPUNIT_TEST(testSetUrl1);
|
||||
CPPUNIT_TEST(testSetUrl2);
|
||||
CPPUNIT_TEST(testSetUrl3);
|
||||
CPPUNIT_TEST(testSetUrl4);
|
||||
CPPUNIT_TEST(testSetUrl5);
|
||||
CPPUNIT_TEST(testSetUrl6);
|
||||
CPPUNIT_TEST(testSetUrl7);
|
||||
CPPUNIT_TEST(testSetUrl8);
|
||||
CPPUNIT_TEST(testSetUrl9);
|
||||
CPPUNIT_TEST(testSetUrl10);
|
||||
CPPUNIT_TEST(testSetUrl11);
|
||||
CPPUNIT_TEST(testSetUrl12);
|
||||
CPPUNIT_TEST(testSetUrl13);
|
||||
CPPUNIT_TEST(testSetUrl14);
|
||||
CPPUNIT_TEST(testSetUrl15);
|
||||
CPPUNIT_TEST(testSetUrl16);
|
||||
CPPUNIT_TEST(testSetUrl17);
|
||||
CPPUNIT_TEST(testSetUrl18);
|
||||
CPPUNIT_TEST(testSetUrl19);
|
||||
CPPUNIT_TEST(testSetUrl20);
|
||||
CPPUNIT_TEST(testSetUrl_username);
|
||||
CPPUNIT_TEST(testSetUrl_usernamePassword);
|
||||
CPPUNIT_TEST(testSetUrl_zeroUsername);
|
||||
CPPUNIT_TEST(testSetUrl_supportsPersistentConnection);
|
||||
CPPUNIT_TEST(testSetUrl_ipv6);
|
||||
CPPUNIT_TEST(testRedirectUrl);
|
||||
CPPUNIT_TEST(testRedirectUrl2);
|
||||
CPPUNIT_TEST(testRedirectUrl_supportsPersistentConnection);
|
||||
CPPUNIT_TEST(testResetUrl);
|
||||
CPPUNIT_TEST(testResetUrl_supportsPersistentConnection);
|
||||
CPPUNIT_TEST(testSetUri1);
|
||||
CPPUNIT_TEST(testSetUri2);
|
||||
CPPUNIT_TEST(testSetUri3);
|
||||
CPPUNIT_TEST(testSetUri4);
|
||||
CPPUNIT_TEST(testSetUri5);
|
||||
CPPUNIT_TEST(testSetUri6);
|
||||
CPPUNIT_TEST(testSetUri7);
|
||||
CPPUNIT_TEST(testSetUri8);
|
||||
CPPUNIT_TEST(testSetUri9);
|
||||
CPPUNIT_TEST(testSetUri10);
|
||||
CPPUNIT_TEST(testSetUri11);
|
||||
CPPUNIT_TEST(testSetUri12);
|
||||
CPPUNIT_TEST(testSetUri13);
|
||||
CPPUNIT_TEST(testSetUri14);
|
||||
CPPUNIT_TEST(testSetUri15);
|
||||
CPPUNIT_TEST(testSetUri16);
|
||||
CPPUNIT_TEST(testSetUri17);
|
||||
CPPUNIT_TEST(testSetUri18);
|
||||
CPPUNIT_TEST(testSetUri19);
|
||||
CPPUNIT_TEST(testSetUri20);
|
||||
CPPUNIT_TEST(testSetUri_username);
|
||||
CPPUNIT_TEST(testSetUri_usernamePassword);
|
||||
CPPUNIT_TEST(testSetUri_zeroUsername);
|
||||
CPPUNIT_TEST(testSetUri_supportsPersistentConnection);
|
||||
CPPUNIT_TEST(testSetUri_ipv6);
|
||||
CPPUNIT_TEST(testRedirectUri);
|
||||
CPPUNIT_TEST(testRedirectUri2);
|
||||
CPPUNIT_TEST(testRedirectUri_supportsPersistentConnection);
|
||||
CPPUNIT_TEST(testResetUri);
|
||||
CPPUNIT_TEST(testResetUri_supportsPersistentConnection);
|
||||
CPPUNIT_TEST(testInnerLink);
|
||||
CPPUNIT_TEST(testInnerLinkInReferer);
|
||||
CPPUNIT_TEST(testGetURIHost);
|
||||
CPPUNIT_TEST_SUITE_END();
|
||||
|
||||
public:
|
||||
void testSetUrl1();
|
||||
void testSetUrl2();
|
||||
void testSetUrl3();
|
||||
void testSetUrl4();
|
||||
void testSetUrl5();
|
||||
void testSetUrl6();
|
||||
void testSetUrl7();
|
||||
void testSetUrl8();
|
||||
void testSetUrl9();
|
||||
void testSetUrl10();
|
||||
void testSetUrl11();
|
||||
void testSetUrl12();
|
||||
void testSetUrl13();
|
||||
void testSetUrl14();
|
||||
void testSetUrl15();
|
||||
void testSetUrl16();
|
||||
void testSetUrl17();
|
||||
void testSetUrl18();
|
||||
void testSetUrl19();
|
||||
void testSetUrl20();
|
||||
void testSetUrl_username();
|
||||
void testSetUrl_usernamePassword();
|
||||
void testSetUrl_zeroUsername();
|
||||
void testSetUrl_supportsPersistentConnection();
|
||||
void testSetUrl_ipv6();
|
||||
void testRedirectUrl();
|
||||
void testRedirectUrl2();
|
||||
void testRedirectUrl_supportsPersistentConnection();
|
||||
void testResetUrl();
|
||||
void testResetUrl_supportsPersistentConnection();
|
||||
void testSetUri1();
|
||||
void testSetUri2();
|
||||
void testSetUri3();
|
||||
void testSetUri4();
|
||||
void testSetUri5();
|
||||
void testSetUri6();
|
||||
void testSetUri7();
|
||||
void testSetUri8();
|
||||
void testSetUri9();
|
||||
void testSetUri10();
|
||||
void testSetUri11();
|
||||
void testSetUri12();
|
||||
void testSetUri13();
|
||||
void testSetUri14();
|
||||
void testSetUri15();
|
||||
void testSetUri16();
|
||||
void testSetUri17();
|
||||
void testSetUri18();
|
||||
void testSetUri19();
|
||||
void testSetUri20();
|
||||
void testSetUri_username();
|
||||
void testSetUri_usernamePassword();
|
||||
void testSetUri_zeroUsername();
|
||||
void testSetUri_supportsPersistentConnection();
|
||||
void testSetUri_ipv6();
|
||||
void testRedirectUri();
|
||||
void testRedirectUri2();
|
||||
void testRedirectUri_supportsPersistentConnection();
|
||||
void testResetUri();
|
||||
void testResetUri_supportsPersistentConnection();
|
||||
void testInnerLink();
|
||||
void testInnerLinkInReferer();
|
||||
void testGetURIHost();
|
||||
|
@ -85,14 +85,14 @@ public:
|
|||
|
||||
CPPUNIT_TEST_SUITE_REGISTRATION( RequestTest );
|
||||
|
||||
void RequestTest::testSetUrl1() {
|
||||
void RequestTest::testSetUri1() {
|
||||
Request req;
|
||||
bool v = req.setUrl("http://aria.rednoah.com/");
|
||||
bool v = req.setUri("http://aria.rednoah.com/");
|
||||
|
||||
CPPUNIT_ASSERT(v);
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("http://aria.rednoah.com/"), req.getUrl());
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("http://aria.rednoah.com/"), req.getCurrentUrl());
|
||||
CPPUNIT_ASSERT_EQUAL(std::string(""), req.getPreviousUrl());
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("http://aria.rednoah.com/"), req.getUri());
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("http://aria.rednoah.com/"), req.getCurrentUri());
|
||||
CPPUNIT_ASSERT_EQUAL(std::string(""), req.getPreviousUri());
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("http"), req.getProtocol());
|
||||
CPPUNIT_ASSERT_EQUAL((uint16_t)80, req.getPort());
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("aria.rednoah.com"), req.getHost());
|
||||
|
@ -104,17 +104,17 @@ void RequestTest::testSetUrl1() {
|
|||
CPPUNIT_ASSERT(!req.isIPv6LiteralAddress());
|
||||
}
|
||||
|
||||
void RequestTest::testSetUrl2() {
|
||||
void RequestTest::testSetUri2() {
|
||||
Request req;
|
||||
bool v = req.setUrl("http://aria.rednoah.com:8080/index.html");
|
||||
bool v = req.setUri("http://aria.rednoah.com:8080/index.html");
|
||||
req.setReferer("http://aria.rednoah.com:8080");
|
||||
|
||||
CPPUNIT_ASSERT(v);
|
||||
|
||||
// referer is unchaged
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("http://aria.rednoah.com:8080"), req.getReferer());
|
||||
// previousUrl must equal to referer;
|
||||
CPPUNIT_ASSERT_EQUAL(req.getReferer(), req.getPreviousUrl());
|
||||
// previousUri must equal to referer;
|
||||
CPPUNIT_ASSERT_EQUAL(req.getReferer(), req.getPreviousUri());
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("http"), req.getProtocol());
|
||||
CPPUNIT_ASSERT_EQUAL((uint16_t)8080, req.getPort());
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("aria.rednoah.com"), req.getHost());
|
||||
|
@ -123,9 +123,9 @@ void RequestTest::testSetUrl2() {
|
|||
CPPUNIT_ASSERT_EQUAL(std::string(""), req.getQuery());
|
||||
}
|
||||
|
||||
void RequestTest::testSetUrl3() {
|
||||
void RequestTest::testSetUri3() {
|
||||
Request req;
|
||||
bool v = req.setUrl("http://aria.rednoah.com/aria2/index.html");
|
||||
bool v = req.setUri("http://aria.rednoah.com/aria2/index.html");
|
||||
|
||||
CPPUNIT_ASSERT(v);
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("http"), req.getProtocol());
|
||||
|
@ -136,9 +136,9 @@ void RequestTest::testSetUrl3() {
|
|||
CPPUNIT_ASSERT_EQUAL(std::string(""), req.getQuery());
|
||||
}
|
||||
|
||||
void RequestTest::testSetUrl4() {
|
||||
void RequestTest::testSetUri4() {
|
||||
Request req;
|
||||
bool v = req.setUrl("http://aria.rednoah.com/aria2/aria3/index.html");
|
||||
bool v = req.setUri("http://aria.rednoah.com/aria2/aria3/index.html");
|
||||
|
||||
CPPUNIT_ASSERT(v);
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("http"), req.getProtocol());
|
||||
|
@ -149,9 +149,9 @@ void RequestTest::testSetUrl4() {
|
|||
CPPUNIT_ASSERT_EQUAL(std::string(""), req.getQuery());
|
||||
}
|
||||
|
||||
void RequestTest::testSetUrl5() {
|
||||
void RequestTest::testSetUri5() {
|
||||
Request req;
|
||||
bool v = req.setUrl("http://aria.rednoah.com/aria2/aria3/");
|
||||
bool v = req.setUri("http://aria.rednoah.com/aria2/aria3/");
|
||||
|
||||
CPPUNIT_ASSERT(v);
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("http"), req.getProtocol());
|
||||
|
@ -162,9 +162,9 @@ void RequestTest::testSetUrl5() {
|
|||
CPPUNIT_ASSERT_EQUAL(std::string(""), req.getQuery());
|
||||
}
|
||||
|
||||
void RequestTest::testSetUrl6() {
|
||||
void RequestTest::testSetUri6() {
|
||||
Request req;
|
||||
bool v = req.setUrl("http://aria.rednoah.com/aria2/aria3");
|
||||
bool v = req.setUri("http://aria.rednoah.com/aria2/aria3");
|
||||
|
||||
CPPUNIT_ASSERT(v);
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("http"), req.getProtocol());
|
||||
|
@ -175,37 +175,37 @@ void RequestTest::testSetUrl6() {
|
|||
CPPUNIT_ASSERT_EQUAL(std::string(""), req.getQuery());
|
||||
}
|
||||
|
||||
void RequestTest::testSetUrl7() {
|
||||
void RequestTest::testSetUri7() {
|
||||
Request req;
|
||||
bool v = req.setUrl("http://");
|
||||
bool v = req.setUri("http://");
|
||||
|
||||
CPPUNIT_ASSERT(!v);
|
||||
}
|
||||
|
||||
void RequestTest::testSetUrl8() {
|
||||
void RequestTest::testSetUri8() {
|
||||
Request req;
|
||||
bool v = req.setUrl("http:/aria.rednoah.com");
|
||||
bool v = req.setUri("http:/aria.rednoah.com");
|
||||
|
||||
CPPUNIT_ASSERT(!v);
|
||||
}
|
||||
|
||||
void RequestTest::testSetUrl9() {
|
||||
void RequestTest::testSetUri9() {
|
||||
Request req;
|
||||
bool v = req.setUrl("h");
|
||||
bool v = req.setUri("h");
|
||||
|
||||
CPPUNIT_ASSERT(!v);
|
||||
}
|
||||
|
||||
void RequestTest::testSetUrl10() {
|
||||
void RequestTest::testSetUri10() {
|
||||
Request req;
|
||||
bool v = req.setUrl("");
|
||||
bool v = req.setUri("");
|
||||
|
||||
CPPUNIT_ASSERT(!v);
|
||||
}
|
||||
|
||||
void RequestTest::testSetUrl11() {
|
||||
void RequestTest::testSetUri11() {
|
||||
Request req;
|
||||
bool v = req.setUrl("http://host?query/");
|
||||
bool v = req.setUri("http://host?query/");
|
||||
|
||||
CPPUNIT_ASSERT(v);
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("http"), req.getProtocol());
|
||||
|
@ -215,9 +215,9 @@ void RequestTest::testSetUrl11() {
|
|||
CPPUNIT_ASSERT_EQUAL(std::string("?query/"), req.getQuery());
|
||||
}
|
||||
|
||||
void RequestTest::testSetUrl12() {
|
||||
void RequestTest::testSetUri12() {
|
||||
Request req;
|
||||
bool v = req.setUrl("http://host?query");
|
||||
bool v = req.setUri("http://host?query");
|
||||
|
||||
CPPUNIT_ASSERT(v);
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("http"), req.getProtocol());
|
||||
|
@ -227,9 +227,9 @@ void RequestTest::testSetUrl12() {
|
|||
CPPUNIT_ASSERT_EQUAL(std::string("?query"), req.getQuery());
|
||||
}
|
||||
|
||||
void RequestTest::testSetUrl13() {
|
||||
void RequestTest::testSetUri13() {
|
||||
Request req;
|
||||
bool v = req.setUrl("http://host/?query");
|
||||
bool v = req.setUri("http://host/?query");
|
||||
|
||||
CPPUNIT_ASSERT(v);
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("http"), req.getProtocol());
|
||||
|
@ -239,9 +239,9 @@ void RequestTest::testSetUrl13() {
|
|||
CPPUNIT_ASSERT_EQUAL(std::string("?query"), req.getQuery());
|
||||
}
|
||||
|
||||
void RequestTest::testSetUrl14() {
|
||||
void RequestTest::testSetUri14() {
|
||||
Request req;
|
||||
bool v = req.setUrl("http://host:8080/abc?query");
|
||||
bool v = req.setUri("http://host:8080/abc?query");
|
||||
|
||||
CPPUNIT_ASSERT(v);
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("http"), req.getProtocol());
|
||||
|
@ -252,11 +252,11 @@ void RequestTest::testSetUrl14() {
|
|||
CPPUNIT_ASSERT_EQUAL(std::string("?query"), req.getQuery());
|
||||
}
|
||||
|
||||
void RequestTest::testSetUrl15()
|
||||
void RequestTest::testSetUri15()
|
||||
{
|
||||
Request req;
|
||||
// 2 slashes after host name and dir
|
||||
bool v = req.setUrl("http://host//dir1/dir2//file");
|
||||
bool v = req.setUri("http://host//dir1/dir2//file");
|
||||
CPPUNIT_ASSERT(v);
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("http"), req.getProtocol());
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("host"), req.getHost());
|
||||
|
@ -265,11 +265,11 @@ void RequestTest::testSetUrl15()
|
|||
CPPUNIT_ASSERT_EQUAL(std::string(""), req.getQuery());
|
||||
}
|
||||
|
||||
void RequestTest::testSetUrl16()
|
||||
void RequestTest::testSetUri16()
|
||||
{
|
||||
Request req;
|
||||
// 2 slashes before file
|
||||
bool v = req.setUrl("http://host//file");
|
||||
bool v = req.setUri("http://host//file");
|
||||
CPPUNIT_ASSERT(v);
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("http"), req.getProtocol());
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("host"), req.getHost());
|
||||
|
@ -278,10 +278,10 @@ void RequestTest::testSetUrl16()
|
|||
CPPUNIT_ASSERT_EQUAL(std::string(""), req.getQuery());
|
||||
}
|
||||
|
||||
void RequestTest::testSetUrl17()
|
||||
void RequestTest::testSetUri17()
|
||||
{
|
||||
Request req;
|
||||
bool v = req.setUrl("http://host:80/file<with%2 %20space/file with space;param%?a=/?");
|
||||
bool v = req.setUri("http://host:80/file<with%2 %20space/file with space;param%?a=/?");
|
||||
CPPUNIT_ASSERT(v);
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("http"), req.getProtocol());
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("host"), req.getHost());
|
||||
|
@ -290,57 +290,57 @@ void RequestTest::testSetUrl17()
|
|||
CPPUNIT_ASSERT_EQUAL(std::string("?a=/?"), req.getQuery());
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("http://host:80/file%3Cwith%252%20%20space"
|
||||
"/file%20with%20space;param%25?a=/?"),
|
||||
req.getCurrentUrl());
|
||||
req.getCurrentUri());
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("http://host:80/file<with%2 %20space"
|
||||
"/file with space;param%?a=/?"),
|
||||
req.getUrl());
|
||||
req.getUri());
|
||||
}
|
||||
|
||||
void RequestTest::testSetUrl18() {
|
||||
void RequestTest::testSetUri18() {
|
||||
Request req;
|
||||
bool v = req.setUrl("http://1/");
|
||||
bool v = req.setUri("http://1/");
|
||||
|
||||
CPPUNIT_ASSERT(v);
|
||||
}
|
||||
|
||||
void RequestTest::testSetUrl19() {
|
||||
void RequestTest::testSetUri19() {
|
||||
Request req;
|
||||
// No host
|
||||
bool v = req.setUrl("http://user@");
|
||||
bool v = req.setUri("http://user@");
|
||||
|
||||
CPPUNIT_ASSERT(!v);
|
||||
}
|
||||
|
||||
void RequestTest::testSetUrl20() {
|
||||
void RequestTest::testSetUri20() {
|
||||
Request req;
|
||||
bool v;
|
||||
// Invalid port
|
||||
v = req.setUrl("http://localhost:65536");
|
||||
v = req.setUri("http://localhost:65536");
|
||||
CPPUNIT_ASSERT(!v);
|
||||
v = req.setUrl("http://localhost:65535");
|
||||
v = req.setUri("http://localhost:65535");
|
||||
CPPUNIT_ASSERT(v);
|
||||
v = req.setUrl("http://localhost:-80");
|
||||
v = req.setUri("http://localhost:-80");
|
||||
CPPUNIT_ASSERT(!v);
|
||||
}
|
||||
|
||||
void RequestTest::testRedirectUrl() {
|
||||
void RequestTest::testRedirectUri() {
|
||||
Request req;
|
||||
req.supportsPersistentConnection(false);
|
||||
req.setUrl("http://aria.rednoah.com:8080/aria2/index.html");
|
||||
req.setUri("http://aria.rednoah.com:8080/aria2/index.html");
|
||||
|
||||
bool v2 = req.redirectUrl("http://aria.rednoah.co.jp/");
|
||||
bool v2 = req.redirectUri("http://aria.rednoah.co.jp/");
|
||||
CPPUNIT_ASSERT(v2);
|
||||
// persistent connection flag is set to be true after redirection
|
||||
CPPUNIT_ASSERT(req.supportsPersistentConnection());
|
||||
// url must be the same
|
||||
// uri must be the same
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("http://aria.rednoah.com:8080/aria2/"
|
||||
"index.html"),
|
||||
req.getUrl());
|
||||
// currentUrl must be updated
|
||||
req.getUri());
|
||||
// currentUri must be updated
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("http://aria.rednoah.co.jp/"),
|
||||
req.getCurrentUrl());
|
||||
// previousUrl must be "" when redirection
|
||||
CPPUNIT_ASSERT_EQUAL(std::string(""), req.getPreviousUrl());
|
||||
req.getCurrentUri());
|
||||
// previousUri must be "" when redirection
|
||||
CPPUNIT_ASSERT_EQUAL(std::string(""), req.getPreviousUri());
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("http"), req.getProtocol());
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("aria.rednoah.co.jp"), req.getHost());
|
||||
CPPUNIT_ASSERT_EQUAL((uint16_t)80, req.getPort());
|
||||
|
@ -351,57 +351,57 @@ void RequestTest::testRedirectUrl() {
|
|||
CPPUNIT_ASSERT_EQUAL((unsigned int)1, req.getRedirectCount());
|
||||
|
||||
// Give abosulute path
|
||||
CPPUNIT_ASSERT(req.redirectUrl("/abspath/to/file"));
|
||||
CPPUNIT_ASSERT(req.redirectUri("/abspath/to/file"));
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("http://aria.rednoah.co.jp/abspath/to/file"),
|
||||
req.getCurrentUrl());
|
||||
req.getCurrentUri());
|
||||
CPPUNIT_ASSERT_EQUAL((unsigned int)2, req.getRedirectCount());
|
||||
|
||||
// Give relative path
|
||||
CPPUNIT_ASSERT(req.redirectUrl("relativepath/to/file"));
|
||||
CPPUNIT_ASSERT(req.redirectUri("relativepath/to/file"));
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("http://aria.rednoah.co.jp/abspath/to/"
|
||||
"relativepath/to/file"),
|
||||
req.getCurrentUrl());
|
||||
req.getCurrentUri());
|
||||
CPPUNIT_ASSERT_EQUAL((unsigned int)3, req.getRedirectCount());
|
||||
|
||||
// White space in path and fragment is appended.
|
||||
CPPUNIT_ASSERT(req.redirectUrl("http://example.org/white space#aria2"));
|
||||
CPPUNIT_ASSERT(req.redirectUri("http://example.org/white space#aria2"));
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("http://example.org/white%20space"),
|
||||
req.getCurrentUrl());
|
||||
req.getCurrentUri());
|
||||
}
|
||||
|
||||
void RequestTest::testRedirectUrl2() {
|
||||
void RequestTest::testRedirectUri2() {
|
||||
Request req;
|
||||
req.setUrl("http://aria.rednoah.com/download.html");
|
||||
CPPUNIT_ASSERT_EQUAL(std::string(""), req.getPreviousUrl());
|
||||
req.setUri("http://aria.rednoah.com/download.html");
|
||||
CPPUNIT_ASSERT_EQUAL(std::string(""), req.getPreviousUri());
|
||||
req.setReferer("http://aria.rednoah.com/");
|
||||
// previousUrl is updated when referer is specified
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("http://aria.rednoah.com/"), req.getPreviousUrl());
|
||||
req.redirectUrl("http://aria.rednoah.com/403.html");
|
||||
// previousUri is updated when referer is specified
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("http://aria.rednoah.com/"), req.getPreviousUri());
|
||||
req.redirectUri("http://aria.rednoah.com/403.html");
|
||||
|
||||
// previousUrl must be "" when redirection
|
||||
CPPUNIT_ASSERT_EQUAL(std::string(""), req.getPreviousUrl());
|
||||
// previousUri must be "" when redirection
|
||||
CPPUNIT_ASSERT_EQUAL(std::string(""), req.getPreviousUri());
|
||||
// referer is unchagned
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("http://aria.rednoah.com/"), req.getReferer());
|
||||
|
||||
req.redirectUrl("http://aria.rednoah.com/error.html");
|
||||
req.redirectUri("http://aria.rednoah.com/error.html");
|
||||
|
||||
// previousUrl must be "" when redirection
|
||||
CPPUNIT_ASSERT_EQUAL(std::string(""), req.getPreviousUrl());
|
||||
// previousUri must be "" when redirection
|
||||
CPPUNIT_ASSERT_EQUAL(std::string(""), req.getPreviousUri());
|
||||
}
|
||||
|
||||
void RequestTest::testResetUrl() {
|
||||
void RequestTest::testResetUri() {
|
||||
Request req;
|
||||
req.setUrl("http://aria.rednoah.com:8080/aria2/index.html");
|
||||
req.setUri("http://aria.rednoah.com:8080/aria2/index.html");
|
||||
req.setReferer("http://aria.rednoah.com:8080/");
|
||||
req.redirectUrl("ftp://aria.rednoah.co.jp/index_en.html?view=wide");
|
||||
req.redirectUri("ftp://aria.rednoah.co.jp/index_en.html?view=wide");
|
||||
|
||||
bool v3 = req.resetUrl();
|
||||
bool v3 = req.resetUri();
|
||||
CPPUNIT_ASSERT(v3);
|
||||
// currentUrl must equal to url
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("http://aria.rednoah.com:8080/aria2/index.html"), req.getUrl());
|
||||
CPPUNIT_ASSERT_EQUAL(req.getUrl(), req.getCurrentUrl());
|
||||
// previousUrl must equal to referer
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("http://aria.rednoah.com:8080/"), req.getPreviousUrl());
|
||||
// currentUri must equal to uri
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("http://aria.rednoah.com:8080/aria2/index.html"), req.getUri());
|
||||
CPPUNIT_ASSERT_EQUAL(req.getUri(), req.getCurrentUri());
|
||||
// previousUri must equal to referer
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("http://aria.rednoah.com:8080/"), req.getPreviousUri());
|
||||
// referer is unchanged
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("http://aria.rednoah.com:8080/"), req.getReferer());
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("http"), req.getProtocol());
|
||||
|
@ -414,13 +414,13 @@ void RequestTest::testResetUrl() {
|
|||
|
||||
void RequestTest::testInnerLink() {
|
||||
Request req;
|
||||
bool v = req.setUrl("http://aria.rednoah.com/index.html#download");
|
||||
bool v = req.setUri("http://aria.rednoah.com/index.html#download");
|
||||
CPPUNIT_ASSERT(v);
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("http://aria.rednoah.com/index.html"
|
||||
"#download"),
|
||||
req.getUrl());
|
||||
req.getUri());
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("http://aria.rednoah.com/index.html"),
|
||||
req.getCurrentUrl());
|
||||
req.getCurrentUri());
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("index.html"), req.getFile());
|
||||
CPPUNIT_ASSERT_EQUAL(std::string(""), req.getQuery());
|
||||
}
|
||||
|
@ -432,10 +432,10 @@ void RequestTest::testInnerLinkInReferer() {
|
|||
req.getReferer());
|
||||
}
|
||||
|
||||
void RequestTest::testSetUrl_zeroUsername()
|
||||
void RequestTest::testSetUri_zeroUsername()
|
||||
{
|
||||
Request req;
|
||||
CPPUNIT_ASSERT(req.setUrl("ftp://@localhost/download/aria2-1.0.0.tar.bz2"));
|
||||
CPPUNIT_ASSERT(req.setUri("ftp://@localhost/download/aria2-1.0.0.tar.bz2"));
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("ftp"), req.getProtocol());
|
||||
CPPUNIT_ASSERT_EQUAL((uint16_t)21, req.getPort());
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("localhost"), req.getHost());
|
||||
|
@ -444,7 +444,7 @@ void RequestTest::testSetUrl_zeroUsername()
|
|||
CPPUNIT_ASSERT_EQUAL(std::string(""), req.getUsername());
|
||||
CPPUNIT_ASSERT_EQUAL(std::string(""), req.getPassword());
|
||||
|
||||
CPPUNIT_ASSERT(req.setUrl("ftp://:@localhost/download/aria2-1.0.0.tar.bz2"));
|
||||
CPPUNIT_ASSERT(req.setUri("ftp://:@localhost/download/aria2-1.0.0.tar.bz2"));
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("ftp"), req.getProtocol());
|
||||
CPPUNIT_ASSERT_EQUAL((uint16_t)21, req.getPort());
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("localhost"), req.getHost());
|
||||
|
@ -453,7 +453,7 @@ void RequestTest::testSetUrl_zeroUsername()
|
|||
CPPUNIT_ASSERT_EQUAL(std::string(""), req.getUsername());
|
||||
CPPUNIT_ASSERT_EQUAL(std::string(""), req.getPassword());
|
||||
|
||||
CPPUNIT_ASSERT(req.setUrl("ftp://:pass@localhost/download/aria2-1.0.0.tar.bz2"));
|
||||
CPPUNIT_ASSERT(req.setUri("ftp://:pass@localhost/download/aria2-1.0.0.tar.bz2"));
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("ftp"), req.getProtocol());
|
||||
CPPUNIT_ASSERT_EQUAL((uint16_t)21, req.getPort());
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("localhost"), req.getHost());
|
||||
|
@ -464,10 +464,10 @@ void RequestTest::testSetUrl_zeroUsername()
|
|||
|
||||
}
|
||||
|
||||
void RequestTest::testSetUrl_username()
|
||||
void RequestTest::testSetUri_username()
|
||||
{
|
||||
Request req;
|
||||
CPPUNIT_ASSERT(req.setUrl("ftp://aria2user@localhost/download/aria2-1.0.0.tar.bz2"));
|
||||
CPPUNIT_ASSERT(req.setUri("ftp://aria2user@localhost/download/aria2-1.0.0.tar.bz2"));
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("ftp"), req.getProtocol());
|
||||
CPPUNIT_ASSERT_EQUAL((uint16_t)21, req.getPort());
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("localhost"), req.getHost());
|
||||
|
@ -477,10 +477,10 @@ void RequestTest::testSetUrl_username()
|
|||
CPPUNIT_ASSERT_EQUAL(std::string(""), req.getPassword());
|
||||
}
|
||||
|
||||
void RequestTest::testSetUrl_usernamePassword()
|
||||
void RequestTest::testSetUri_usernamePassword()
|
||||
{
|
||||
Request req;
|
||||
CPPUNIT_ASSERT(req.setUrl("ftp://aria2user%40:aria2pass%40@localhost/download/aria2-1.0.0.tar.bz2"));
|
||||
CPPUNIT_ASSERT(req.setUri("ftp://aria2user%40:aria2pass%40@localhost/download/aria2-1.0.0.tar.bz2"));
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("ftp"), req.getProtocol());
|
||||
CPPUNIT_ASSERT_EQUAL((uint16_t)21, req.getPort());
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("localhost"), req.getHost());
|
||||
|
@ -489,51 +489,51 @@ void RequestTest::testSetUrl_usernamePassword()
|
|||
CPPUNIT_ASSERT_EQUAL(std::string("aria2user@"), req.getUsername());
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("aria2pass@"), req.getPassword());
|
||||
|
||||
// make sure that after new url is set, username and password are updated.
|
||||
CPPUNIT_ASSERT(req.setUrl("ftp://localhost/download/aria2-1.0.0.tar.bz2"));
|
||||
// make sure that after new uri is set, username and password are updated.
|
||||
CPPUNIT_ASSERT(req.setUri("ftp://localhost/download/aria2-1.0.0.tar.bz2"));
|
||||
CPPUNIT_ASSERT_EQUAL(std::string(""), req.getUsername());
|
||||
CPPUNIT_ASSERT_EQUAL(std::string(""), req.getPassword());
|
||||
|
||||
}
|
||||
|
||||
void RequestTest::testSetUrl_supportsPersistentConnection()
|
||||
void RequestTest::testSetUri_supportsPersistentConnection()
|
||||
{
|
||||
Request req;
|
||||
CPPUNIT_ASSERT(req.setUrl("http://host/file"));
|
||||
CPPUNIT_ASSERT(req.setUri("http://host/file"));
|
||||
req.supportsPersistentConnection(false);
|
||||
CPPUNIT_ASSERT(!req.supportsPersistentConnection());
|
||||
req.setUrl("http://host/file");
|
||||
req.setUri("http://host/file");
|
||||
CPPUNIT_ASSERT(req.supportsPersistentConnection());
|
||||
}
|
||||
|
||||
void RequestTest::testResetUrl_supportsPersistentConnection()
|
||||
void RequestTest::testResetUri_supportsPersistentConnection()
|
||||
{
|
||||
Request req;
|
||||
CPPUNIT_ASSERT(req.setUrl("http://host/file"));
|
||||
CPPUNIT_ASSERT(req.setUri("http://host/file"));
|
||||
req.supportsPersistentConnection(false);
|
||||
CPPUNIT_ASSERT(!req.supportsPersistentConnection());
|
||||
req.resetUrl();
|
||||
req.resetUri();
|
||||
CPPUNIT_ASSERT(req.supportsPersistentConnection());
|
||||
}
|
||||
|
||||
void RequestTest::testRedirectUrl_supportsPersistentConnection()
|
||||
void RequestTest::testRedirectUri_supportsPersistentConnection()
|
||||
{
|
||||
Request req;
|
||||
CPPUNIT_ASSERT(req.setUrl("http://host/file"));
|
||||
CPPUNIT_ASSERT(req.setUri("http://host/file"));
|
||||
req.supportsPersistentConnection(false);
|
||||
CPPUNIT_ASSERT(!req.supportsPersistentConnection());
|
||||
req.redirectUrl("http://host/file");
|
||||
req.redirectUri("http://host/file");
|
||||
CPPUNIT_ASSERT(req.supportsPersistentConnection());
|
||||
}
|
||||
|
||||
void RequestTest::testSetUrl_ipv6()
|
||||
void RequestTest::testSetUri_ipv6()
|
||||
{
|
||||
Request req;
|
||||
CPPUNIT_ASSERT(!req.setUrl("http://[::1"));
|
||||
CPPUNIT_ASSERT(req.setUrl("http://[::1]"));
|
||||
CPPUNIT_ASSERT(!req.setUri("http://[::1"));
|
||||
CPPUNIT_ASSERT(req.setUri("http://[::1]"));
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("::1"), req.getHost());
|
||||
|
||||
CPPUNIT_ASSERT(req.setUrl("http://[::1]:8000/dir/file"));
|
||||
CPPUNIT_ASSERT(req.setUri("http://[::1]:8000/dir/file"));
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("::1"), req.getHost());
|
||||
CPPUNIT_ASSERT_EQUAL((uint16_t)8000, req.getPort());
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("/dir"), req.getDir());
|
||||
|
@ -544,7 +544,7 @@ void RequestTest::testSetUrl_ipv6()
|
|||
void RequestTest::testGetURIHost()
|
||||
{
|
||||
Request req;
|
||||
CPPUNIT_ASSERT(req.setUrl("http://[::1]"));
|
||||
CPPUNIT_ASSERT(req.setUri("http://[::1]"));
|
||||
CPPUNIT_ASSERT_EQUAL(std::string("[::1]"), req.getURIHost());
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue