2007-10-30 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>

Added ftp://USER:PASSWD@Servername automatic parsing.
	* src/Request.{h, cc}: Removed AuthResolvers. Added _username 
and
	_password. Recognize username and password in URI.
	* src/main.cc: Use AuthConfigFactory instead of RequestFactory.
	* src/RequestGroup.cc: Use AuthConfigFactory instead of 
RequestFactory.
	* src/RequestFactory.{h, cc}: Removed.
	* src/AuthConfigFactory.{h, cc}: New class.
	* src/FtpConnection.cc: Use AuthConfigFactory.
	* src/HttpRequest.cc: Use AuthConfigFactory.
	* test/HttpRequestTest.cc: Updated.
	* test/RequestTest.cc: Updated.
	* test/AuthConfigFactoryTest.cc: New class.
	* test/RequestFactoryTest.cc: Removed.
pull/1/head
Tatsuhiro Tsujikawa 2007-10-30 12:48:01 +00:00
parent f3f8cc593c
commit 6b7df851d3
19 changed files with 363 additions and 390 deletions

View File

@ -1,3 +1,19 @@
2007-10-30 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
Added ftp://USER:PASSWD@Servername automatic parsing.
* src/Request.{h, cc}: Removed AuthResolvers. Added _username and
_password. Recognize username and password in URI.
* src/main.cc: Use AuthConfigFactory instead of RequestFactory.
* src/RequestGroup.cc: Use AuthConfigFactory instead of RequestFactory.
* src/RequestFactory.{h, cc}: Removed.
* src/AuthConfigFactory.{h, cc}: New class.
* src/FtpConnection.cc: Use AuthConfigFactory.
* src/HttpRequest.cc: Use AuthConfigFactory.
* test/HttpRequestTest.cc: Updated.
* test/RequestTest.cc: Updated.
* test/AuthConfigFactoryTest.cc: New class.
* test/RequestFactoryTest.cc: Removed.
2007-10-29 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com> 2007-10-29 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
Use RequestGroup::allDownloadFinished() to decide whether the control Use RequestGroup::allDownloadFinished() to decide whether the control

1
TODO
View File

@ -52,7 +52,6 @@
* Reimplement ChecksumCommand(validation using 1 checksum for 1 file) * Reimplement ChecksumCommand(validation using 1 checksum for 1 file)
* Implement duplicate download checking in Bt * Implement duplicate download checking in Bt
* Add PeerListenCommand to DownloadEngine only when it is really necessary. * Add PeerListenCommand to DownloadEngine only when it is really necessary.
* ftp://USER:PASSWD@Servername automatic parsing
* improve --metalink-location field * improve --metalink-location field
* Use content-type for PostDownloadHandler * Use content-type for PostDownloadHandler
* Torrent information * Torrent information

View File

@ -32,24 +32,41 @@
* files in the program, then also delete it here. * files in the program, then also delete it here.
*/ */
/* copyright --> */ /* copyright --> */
#include "RequestFactory.h" #include "AuthConfigFactory.h"
#include "prefs.h" #include "Option.h"
#include "AbstractAuthResolver.h" #include "AuthConfig.h"
#include "NetrcAuthResolver.h" #include "Netrc.h"
#include "DefaultAuthResolver.h" #include "DefaultAuthResolver.h"
#include "NetrcAuthResolver.h"
#include "prefs.h"
#include "Request.h"
RequestHandle RequestFactory::createRequest() AuthConfigFactory::AuthConfigFactory(const Option* option):
_option(option), _netrc(0) {}
AuthConfigFactory::~AuthConfigFactory() {}
AuthConfigHandle AuthConfigFactory::createAuthConfig(const RequestHandle& request) const
{ {
RequestHandle request = new Request(); if(request->getProtocol() == "http" || request->getProtocol() == "https") {
request->setMethod(_method); return createHttpAuthResolver()->resolveAuthConfig(request->getHost());
request->setReferer(_referer); } else if(request->getProtocol() == "ftp") {
request->setHttpAuthResolver(createHttpAuthResolver()); if(!request->getUsername().empty()) {
request->setHttpProxyAuthResolver(createHttpProxyAuthResolver()); return createAuthConfig(request->getUsername(), request->getPassword());
request->setFtpAuthResolver(createFtpAuthResolver()); } else {
return request; return createFtpAuthResolver()->resolveAuthConfig(request->getHost());
}
} else {
return new AuthConfig();
}
} }
AuthConfigHandle RequestFactory::createAuthConfig(const string& user, const string& password) const AuthConfigHandle AuthConfigFactory::createAuthConfigForHttpProxy(const RequestHandle& request) const
{
return createHttpProxyAuthResolver()->resolveAuthConfig(request->getHost());
}
AuthConfigHandle AuthConfigFactory::createAuthConfig(const string& user, const string& password) const
{ {
if(user.length() > 0) { if(user.length() > 0) {
return new AuthConfig(user, password); return new AuthConfig(user, password);
@ -58,7 +75,7 @@ AuthConfigHandle RequestFactory::createAuthConfig(const string& user, const stri
} }
} }
AuthResolverHandle RequestFactory::createHttpAuthResolver() AuthResolverHandle AuthConfigFactory::createHttpAuthResolver() const
{ {
AbstractAuthResolverHandle resolver = 0; AbstractAuthResolverHandle resolver = 0;
if(true || _option->getAsBool(PREF_NO_NETRC)) { if(true || _option->getAsBool(PREF_NO_NETRC)) {
@ -72,7 +89,7 @@ AuthResolverHandle RequestFactory::createHttpAuthResolver()
return resolver; return resolver;
} }
AuthResolverHandle RequestFactory::createFtpAuthResolver() AuthResolverHandle AuthConfigFactory::createFtpAuthResolver() const
{ {
AbstractAuthResolverHandle resolver = 0; AbstractAuthResolverHandle resolver = 0;
if(_option->getAsBool(PREF_NO_NETRC)) { if(_option->getAsBool(PREF_NO_NETRC)) {
@ -87,7 +104,7 @@ AuthResolverHandle RequestFactory::createFtpAuthResolver()
return resolver; return resolver;
} }
AuthResolverHandle RequestFactory::createHttpProxyAuthResolver() AuthResolverHandle AuthConfigFactory::createHttpProxyAuthResolver() const
{ {
AbstractAuthResolverHandle resolver = 0; AbstractAuthResolverHandle resolver = 0;
if(true || _option->getAsBool(PREF_NO_NETRC)) { if(true || _option->getAsBool(PREF_NO_NETRC)) {
@ -100,3 +117,8 @@ AuthResolverHandle RequestFactory::createHttpProxyAuthResolver()
resolver->setUserDefinedAuthConfig(createAuthConfig(_option->get(PREF_HTTP_PROXY_USER), _option->get(PREF_HTTP_PROXY_PASSWD))); resolver->setUserDefinedAuthConfig(createAuthConfig(_option->get(PREF_HTTP_PROXY_USER), _option->get(PREF_HTTP_PROXY_PASSWD)));
return resolver; return resolver;
} }
void AuthConfigFactory::setNetrc(const NetrcHandle& netrc)
{
_netrc = netrc;
}

View File

@ -32,59 +32,49 @@
* files in the program, then also delete it here. * files in the program, then also delete it here.
*/ */
/* copyright --> */ /* copyright --> */
#ifndef _D_REQUEST_FACTORY_H_ #ifndef _D_AUTH_CONFIG_FACTORY_H_
#define _D_REQUEST_FACTORY_H_ #define _D_AUTH_CONFIG_FACTORY_H_
#include "common.h" #include "common.h"
#include "Request.h"
#include "Option.h"
#include "Netrc.h"
class RequestFactory { class Option;
class Netrc;
extern typedef SharedHandle<Netrc> NetrcHandle;
class AuthConfig;
extern typedef SharedHandle<AuthConfig> AuthConfigHandle;
class Request;
extern typedef SharedHandle<Request> RequestHandle;
class AuthResolver;
extern typedef SharedHandle<AuthResolver> AuthResolverHandle;
class AuthConfigFactory {
private: private:
const Option* _option; const Option* _option;
NetrcHandle _netrc;
string _method;
string _referer;
NetrcHandle _netrc;
AuthConfigHandle createAuthConfig(const string& user, const string& password) const; AuthConfigHandle createAuthConfig(const string& user, const string& password) const;
AuthResolverHandle createHttpAuthResolver() const;
AuthResolverHandle createHttpProxyAuthResolver() const;
AuthResolverHandle createFtpAuthResolver() const;
public: public:
RequestFactory():_option(0),
_netrc(0), AuthConfigFactory(const Option* option);
_method(Request::METHOD_GET)
{}
RequestHandle createRequest(); ~AuthConfigFactory();
AuthResolverHandle createHttpAuthResolver(); AuthConfigHandle createAuthConfig(const RequestHandle& request) const;
AuthResolverHandle createHttpProxyAuthResolver(); AuthConfigHandle createAuthConfigForHttpProxy(const RequestHandle& request) const;
AuthResolverHandle createFtpAuthResolver(); void setNetrc(const NetrcHandle& netrc);
void setOption(const Option* option)
{
_option = option;
}
void setNetrc(const NetrcHandle& netrc)
{
_netrc = netrc;
}
void setMethod(const string& method)
{
_method = method;
}
void setReferer(const string& referer)
{
_referer = referer;
}
}; };
typedef SharedHandle<RequestFactory> RequestFactoryHandle; typedef SharedHandle<AuthConfigFactory> AuthConfigFactoryHandle;
typedef SingletonHolder<RequestFactoryHandle> RequestFactorySingletonHolder; typedef SingletonHolder<AuthConfigFactoryHandle> AuthConfigFactorySingleton;
#endif // _D_REQUEST_FACTORY_H_ #endif // _D_AUTH_CONFIG_FACTORY_H_

View File

@ -37,6 +37,8 @@
#include "message.h" #include "message.h"
#include "prefs.h" #include "prefs.h"
#include "LogFactory.h" #include "LogFactory.h"
#include "AuthConfigFactory.h"
#include "AuthConfig.h"
FtpConnection::FtpConnection(int32_t cuid, const SocketHandle& socket, FtpConnection::FtpConnection(int32_t cuid, const SocketHandle& socket,
const RequestHandle req, const Option* op) const RequestHandle req, const Option* op)
@ -49,7 +51,7 @@ FtpConnection::~FtpConnection() {}
void FtpConnection::sendUser() const void FtpConnection::sendUser() const
throw(DlRetryEx*) throw(DlRetryEx*)
{ {
string request = "USER "+req->resolveFtpAuthConfig()->getUser()+"\r\n"; string request = "USER "+AuthConfigFactorySingleton::instance()->createAuthConfig(req)->getUser()+"\r\n";
logger->info(MSG_SENDING_REQUEST, cuid, request.c_str()); logger->info(MSG_SENDING_REQUEST, cuid, request.c_str());
socket->writeData(request); socket->writeData(request);
} }
@ -57,7 +59,7 @@ void FtpConnection::sendUser() const
void FtpConnection::sendPass() const void FtpConnection::sendPass() const
throw(DlRetryEx*) throw(DlRetryEx*)
{ {
string request = "PASS "+req->resolveFtpAuthConfig()->getPassword()+"\r\n"; string request = "PASS "+AuthConfigFactorySingleton::instance()->createAuthConfig(req)->getPassword()+"\r\n";
logger->info(MSG_SENDING_REQUEST, cuid, "PASS ********"); logger->info(MSG_SENDING_REQUEST, cuid, "PASS ********");
socket->writeData(request); socket->writeData(request);
} }

View File

@ -36,6 +36,8 @@
#include "Util.h" #include "Util.h"
#include "Base64.h" #include "Base64.h"
#include "prefs.h" #include "prefs.h"
#include "AuthConfigFactory.h"
#include "AuthConfig.h"
RangeHandle HttpRequest::getRange() const RangeHandle HttpRequest::getRange() const
{ {
@ -112,7 +114,7 @@ string HttpRequest::createRequest() const
} }
if(authEnabled) { if(authEnabled) {
requestLine += "Authorization: Basic "+ requestLine += "Authorization: Basic "+
Base64::encode(request->resolveHttpAuthConfig()->getAuthText())+"\r\n"; Base64::encode(AuthConfigFactorySingleton::instance()->createAuthConfig(request)->getAuthText())+"\r\n";
} }
if(getPreviousURI().size()) { if(getPreviousURI().size()) {
requestLine += "Referer: "+getPreviousURI()+"\r\n"; requestLine += "Referer: "+getPreviousURI()+"\r\n";
@ -154,7 +156,7 @@ string HttpRequest::createProxyRequest() const
string HttpRequest::getProxyAuthString() const { string HttpRequest::getProxyAuthString() const {
return "Proxy-Authorization: Basic "+ return "Proxy-Authorization: Basic "+
Base64::encode(request->resolveHttpProxyAuthConfig()->getAuthText())+"\r\n"; Base64::encode(AuthConfigFactorySingleton::instance()->createAuthConfigForHttpProxy(request)->getAuthText())+"\r\n";
} }
void HttpRequest::configure(const Option* option) void HttpRequest::configure(const Option* option)

View File

@ -74,7 +74,7 @@ SRCS = Socket.h\
AbstractAuthResolver.h\ AbstractAuthResolver.h\
DefaultAuthResolver.cc DefaultAuthResolver.h\ DefaultAuthResolver.cc DefaultAuthResolver.h\
NetrcAuthResolver.cc NetrcAuthResolver.h\ NetrcAuthResolver.cc NetrcAuthResolver.h\
RequestFactory.cc RequestFactory.h\ AuthConfigFactory.cc AuthConfigFactory.h\
OptionParser.cc OptionParser.h\ OptionParser.cc OptionParser.h\
OptionHandlerFactory.cc OptionHandlerFactory.h\ OptionHandlerFactory.cc OptionHandlerFactory.h\
NameResolver.cc NameResolver.h\ NameResolver.cc NameResolver.h\

View File

@ -233,8 +233,8 @@ am__libaria2c_a_SOURCES_DIST = Socket.h SocketCore.cc SocketCore.h \
AbstractProxyResponseCommand.h Netrc.cc Netrc.h AuthConfig.cc \ AbstractProxyResponseCommand.h Netrc.cc Netrc.h AuthConfig.cc \
AuthConfig.h AuthResolver.h AbstractAuthResolver.h \ AuthConfig.h AuthResolver.h AbstractAuthResolver.h \
DefaultAuthResolver.cc DefaultAuthResolver.h \ DefaultAuthResolver.cc DefaultAuthResolver.h \
NetrcAuthResolver.cc NetrcAuthResolver.h RequestFactory.cc \ NetrcAuthResolver.cc NetrcAuthResolver.h AuthConfigFactory.cc \
RequestFactory.h OptionParser.cc OptionParser.h \ AuthConfigFactory.h OptionParser.cc OptionParser.h \
OptionHandlerFactory.cc OptionHandlerFactory.h NameResolver.cc \ OptionHandlerFactory.cc OptionHandlerFactory.h NameResolver.cc \
NameResolver.h RequestGroup.cc RequestGroup.h \ NameResolver.h RequestGroup.cc RequestGroup.h \
RequestGroupAware.cc RequestGroupAware.h RequestGroupMan.cc \ RequestGroupAware.cc RequestGroupAware.h RequestGroupMan.cc \
@ -462,7 +462,7 @@ am__objects_12 = SocketCore.$(OBJEXT) Command.$(OBJEXT) \
HttpRequest.$(OBJEXT) AbstractProxyRequestCommand.$(OBJEXT) \ HttpRequest.$(OBJEXT) AbstractProxyRequestCommand.$(OBJEXT) \
AbstractProxyResponseCommand.$(OBJEXT) Netrc.$(OBJEXT) \ AbstractProxyResponseCommand.$(OBJEXT) Netrc.$(OBJEXT) \
AuthConfig.$(OBJEXT) DefaultAuthResolver.$(OBJEXT) \ AuthConfig.$(OBJEXT) DefaultAuthResolver.$(OBJEXT) \
NetrcAuthResolver.$(OBJEXT) RequestFactory.$(OBJEXT) \ NetrcAuthResolver.$(OBJEXT) AuthConfigFactory.$(OBJEXT) \
OptionParser.$(OBJEXT) OptionHandlerFactory.$(OBJEXT) \ OptionParser.$(OBJEXT) OptionHandlerFactory.$(OBJEXT) \
NameResolver.$(OBJEXT) RequestGroup.$(OBJEXT) \ NameResolver.$(OBJEXT) RequestGroup.$(OBJEXT) \
RequestGroupAware.$(OBJEXT) RequestGroupMan.$(OBJEXT) \ RequestGroupAware.$(OBJEXT) RequestGroupMan.$(OBJEXT) \
@ -723,8 +723,8 @@ SRCS = Socket.h SocketCore.cc SocketCore.h Command.cc Command.h \
AbstractProxyResponseCommand.h Netrc.cc Netrc.h AuthConfig.cc \ AbstractProxyResponseCommand.h Netrc.cc Netrc.h AuthConfig.cc \
AuthConfig.h AuthResolver.h AbstractAuthResolver.h \ AuthConfig.h AuthResolver.h AbstractAuthResolver.h \
DefaultAuthResolver.cc DefaultAuthResolver.h \ DefaultAuthResolver.cc DefaultAuthResolver.h \
NetrcAuthResolver.cc NetrcAuthResolver.h RequestFactory.cc \ NetrcAuthResolver.cc NetrcAuthResolver.h AuthConfigFactory.cc \
RequestFactory.h OptionParser.cc OptionParser.h \ AuthConfigFactory.h OptionParser.cc OptionParser.h \
OptionHandlerFactory.cc OptionHandlerFactory.h NameResolver.cc \ OptionHandlerFactory.cc OptionHandlerFactory.h NameResolver.cc \
NameResolver.h RequestGroup.cc RequestGroup.h \ NameResolver.h RequestGroup.cc RequestGroup.h \
RequestGroupAware.cc RequestGroupAware.h RequestGroupMan.cc \ RequestGroupAware.cc RequestGroupAware.h RequestGroupMan.cc \
@ -857,6 +857,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ActivePeerConnectionCommand.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ActivePeerConnectionCommand.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AnnounceList.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AnnounceList.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AuthConfig.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AuthConfig.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AuthConfigFactory.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AutoSaveCommand.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AutoSaveCommand.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Base64.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Base64.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BitfieldMan.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BitfieldMan.Po@am__quote@
@ -988,7 +989,6 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PostDownloadHandler.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PostDownloadHandler.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RealtimeCommand.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RealtimeCommand.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Request.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Request.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RequestFactory.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RequestGroup.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RequestGroup.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RequestGroupAware.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RequestGroupAware.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RequestGroupEntry.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RequestGroupEntry.Po@am__quote@

View File

@ -42,9 +42,6 @@ const string Request::METHOD_GET = "get";
const string Request::METHOD_HEAD = "head"; const string Request::METHOD_HEAD = "head";
Request::Request():port(0), tryCount(0), keepAlive(false), method(METHOD_GET), Request::Request():port(0), tryCount(0), keepAlive(false), method(METHOD_GET),
_httpAuthResolver(0),
_httpProxyAuthResolver(0),
_ftpAuthResolver(0),
cookieBox(CookieBoxFactorySingletonHolder::instance()->createNewInstance()) {} cookieBox(CookieBoxFactorySingletonHolder::instance()->createNewInstance()) {}
Request::~Request() {} Request::~Request() {}
@ -84,14 +81,18 @@ bool Request::parseUrl(const string& url) {
port = 0; port = 0;
dir = ""; dir = "";
file = ""; file = "";
_username = "";
_password = "";
if(tempUrl.find_first_not_of(SAFE_CHARS) != string::npos) { if(tempUrl.find_first_not_of(SAFE_CHARS) != string::npos) {
return false; return false;
} }
// find query part
string::size_type startQueryIndex = tempUrl.find("?"); string::size_type startQueryIndex = tempUrl.find("?");
if(startQueryIndex != string::npos) { if(startQueryIndex != string::npos) {
query = tempUrl.substr(startQueryIndex); query = tempUrl.substr(startQueryIndex);
tempUrl.erase(startQueryIndex); tempUrl.erase(startQueryIndex);
} }
// find protocol
string::size_type hp = tempUrl.find("://"); string::size_type hp = tempUrl.find("://");
if(hp == string::npos) return false; if(hp == string::npos) return false;
protocol = tempUrl.substr(0, hp); protocol = tempUrl.substr(0, hp);
@ -100,13 +101,24 @@ bool Request::parseUrl(const string& url) {
return false; return false;
} }
hp += 3; hp += 3;
// find host part
if(tempUrl.size() <= hp) return false; if(tempUrl.size() <= hp) return false;
string::size_type hep = tempUrl.find("/", hp); string::size_type hep = tempUrl.find("/", hp);
if(hep == string::npos) { if(hep == string::npos) {
hep = tempUrl.size(); 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<string, string> userPass = Util::split(authPart, ":");
_username = Util::urldecode(userPass.first);
_password = Util::urldecode(userPass.second);
hostPart.erase(0, atmarkp+1);
}
pair<string, string> hostAndPort; pair<string, string> hostAndPort;
Util::split(hostAndPort, tempUrl.substr(hp, hep-hp), ':'); Util::split(hostAndPort, hostPart, ':');
host = hostAndPort.first; host = hostAndPort.first;
if(hostAndPort.second != "") { if(hostAndPort.second != "") {
port = strtol(hostAndPort.second.c_str(), NULL, 10); port = strtol(hostAndPort.second.c_str(), NULL, 10);
@ -117,6 +129,7 @@ bool Request::parseUrl(const string& url) {
// If port is not specified, then we set it to default port of its protocol.. // If port is not specified, then we set it to default port of its protocol..
port = defPort; port = defPort;
} }
// find directory and file part
string::size_type direp = tempUrl.find_last_of("/"); string::size_type direp = tempUrl.find_last_of("/");
if(direp == string::npos || direp <= hep) { if(direp == string::npos || direp <= hep) {
dir = "/"; dir = "/";
@ -139,18 +152,3 @@ bool Request::parseUrl(const string& url) {
file += query; file += query;
return true; return true;
} }
AuthConfigHandle Request::resolveHttpAuthConfig()
{
return _httpAuthResolver->resolveAuthConfig(getHost());
}
AuthConfigHandle Request::resolveFtpAuthConfig()
{
return _ftpAuthResolver->resolveAuthConfig(getHost());
}
AuthConfigHandle Request::resolveHttpProxyAuthConfig()
{
return _httpProxyAuthResolver->resolveAuthConfig(getHost());
}

View File

@ -36,8 +36,6 @@
#define _D_REQUEST_H_ #define _D_REQUEST_H_
#include "common.h" #include "common.h"
#include "CookieBox.h" #include "CookieBox.h"
#include "AuthConfig.h"
#include "AuthResolver.h"
#define SAFE_CHARS "abcdefghijklmnopqrstuvwxyz"\ #define SAFE_CHARS "abcdefghijklmnopqrstuvwxyz"\
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"\ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"\
@ -80,11 +78,9 @@ private:
bool keepAlive; bool keepAlive;
string method; string method;
AuthResolverHandle _httpAuthResolver; string _username;
AuthResolverHandle _httpProxyAuthResolver; string _password;
AuthResolverHandle _ftpAuthResolver;
bool parseUrl(const string& url); bool parseUrl(const string& url);
public: public:
@ -125,27 +121,16 @@ public:
this->method = method; this->method = method;
} }
void setHttpAuthResolver(const AuthResolverHandle& authResolver) const string& getUsername() const
{ {
_httpAuthResolver = authResolver; return _username;
} }
void setHttpProxyAuthResolver(const AuthResolverHandle& authResolver) const string& getPassword() const
{ {
_httpProxyAuthResolver = authResolver; return _password;
} }
void setFtpAuthResolver(const AuthResolverHandle& authResolver)
{
_ftpAuthResolver = authResolver;
}
AuthConfigHandle resolveHttpAuthConfig();
AuthConfigHandle resolveFtpAuthConfig();
AuthConfigHandle resolveHttpProxyAuthConfig();
const string& getMethod() const { const string& getMethod() const {
return method; return method;
} }

View File

@ -39,7 +39,6 @@
#include "SegmentManFactory.h" #include "SegmentManFactory.h"
#include "Dependency.h" #include "Dependency.h"
#include "prefs.h" #include "prefs.h"
#include "RequestFactory.h"
#include "InitiateConnectionCommandFactory.h" #include "InitiateConnectionCommandFactory.h"
#include "CUIDCounter.h" #include "CUIDCounter.h"
#include "File.h" #include "File.h"
@ -236,7 +235,7 @@ Commands RequestGroup::createNextCommand(DownloadEngine* e, int32_t numCommand,
for(;!_uris.empty() && numCommand--; _uris.pop_front()) { for(;!_uris.empty() && numCommand--; _uris.pop_front()) {
string uri = _uris.front(); string uri = _uris.front();
_spentUris.push_back(uri); _spentUris.push_back(uri);
RequestHandle req = RequestFactorySingletonHolder::instance()->createRequest(); RequestHandle req = new Request();
req->setReferer(_option->get(PREF_REFERER)); req->setReferer(_option->get(PREF_REFERER));
req->setMethod(method); req->setMethod(method);
if(req->setUrl(uri)) { if(req->setUrl(uri)) {

View File

@ -40,7 +40,7 @@
#include "BitfieldManFactory.h" #include "BitfieldManFactory.h"
#include "SimpleRandomizer.h" #include "SimpleRandomizer.h"
#include "Netrc.h" #include "Netrc.h"
#include "RequestFactory.h" #include "AuthConfigFactory.h"
#include "FatalException.h" #include "FatalException.h"
#include "File.h" #include "File.h"
#include "CUIDCounter.h" #include "CUIDCounter.h"
@ -58,6 +58,7 @@
#include "SingleFileDownloadContext.h" #include "SingleFileDownloadContext.h"
#include "DefaultBtContext.h" #include "DefaultBtContext.h"
#include "RequestGroup.h" #include "RequestGroup.h"
#include "Option.h"
#include <deque> #include <deque>
#include <algorithm> #include <algorithm>
#include <signal.h> #include <signal.h>
@ -153,8 +154,7 @@ int main(int argc, char* argv[]) {
logger->info("%s %s", PACKAGE, PACKAGE_VERSION); logger->info("%s %s", PACKAGE, PACKAGE_VERSION);
logger->info(MSG_LOGGING_STARTED); logger->info(MSG_LOGGING_STARTED);
RequestFactoryHandle requestFactory = new RequestFactory(); AuthConfigFactoryHandle authConfigFactory = new AuthConfigFactory(op);
requestFactory->setOption(op);
File netrccf(op->get(PREF_NETRC_PATH)); File netrccf(op->get(PREF_NETRC_PATH));
if(!op->getAsBool(PREF_NO_NETRC) && netrccf.isFile()) { if(!op->getAsBool(PREF_NO_NETRC) && netrccf.isFile()) {
mode_t mode = netrccf.mode(); mode_t mode = netrccf.mode();
@ -164,7 +164,7 @@ int main(int argc, char* argv[]) {
} else { } else {
NetrcHandle netrc = new Netrc(); NetrcHandle netrc = new Netrc();
netrc->parse(op->get(PREF_NETRC_PATH)); netrc->parse(op->get(PREF_NETRC_PATH));
requestFactory->setNetrc(netrc); authConfigFactory->setNetrc(netrc);
} }
} }
@ -181,7 +181,7 @@ int main(int argc, char* argv[]) {
} }
} }
RequestFactorySingletonHolder::instance(requestFactory); AuthConfigFactorySingleton::instance(authConfigFactory);
CUIDCounterHandle cuidCounter = new CUIDCounter(); CUIDCounterHandle cuidCounter = new CUIDCounter();
CUIDCounterSingletonHolder::instance(cuidCounter); CUIDCounterSingletonHolder::instance(cuidCounter);
#ifdef SIGPIPE #ifdef SIGPIPE

View File

@ -0,0 +1,124 @@
#include "AuthConfigFactory.h"
#include "Netrc.h"
#include "prefs.h"
#include "Request.h"
#include "AuthConfig.h"
#include "Option.h"
#include <cppunit/extensions/HelperMacros.h>
class AuthConfigFactoryTest:public CppUnit::TestFixture {
CPPUNIT_TEST_SUITE(AuthConfigFactoryTest);
CPPUNIT_TEST(testCreateAuthConfig_http);
CPPUNIT_TEST(testCreateAuthConfigForHttpProxy);
CPPUNIT_TEST(testCreateAuthConfig_ftp);
CPPUNIT_TEST_SUITE_END();
public:
void testCreateAuthConfig_http();
void testCreateAuthConfigForHttpProxy();
void testCreateAuthConfig_ftp();
};
CPPUNIT_TEST_SUITE_REGISTRATION( AuthConfigFactoryTest );
void AuthConfigFactoryTest::testCreateAuthConfig_http()
{
RequestHandle req = new Request();
req->setUrl("http://localhost/download/aria2-1.0.0.tar.bz2");
Option option;
option.put(PREF_NO_NETRC, V_FALSE);
AuthConfigFactory factory(&option);
// without auth info
CPPUNIT_ASSERT_EQUAL(string(":"),
factory.createAuthConfig(req)->getAuthText());
// with Netrc: disabled by default
NetrcHandle netrc = new Netrc();
netrc->addAuthenticator(new DefaultAuthenticator("default", "defaultpassword", "defaultaccount"));
factory.setNetrc(netrc);
CPPUNIT_ASSERT_EQUAL(string(":"),
factory.createAuthConfig(req)->getAuthText());
// with Netrc + user defined
option.put(PREF_HTTP_USER, "userDefinedUser");
option.put(PREF_HTTP_PASSWD, "userDefinedPassword");
CPPUNIT_ASSERT_EQUAL(string("userDefinedUser:userDefinedPassword"),
factory.createAuthConfig(req)->getAuthText());
// username and password in URI: disabled by default.
req->setUrl("http://aria2user:aria2password@localhost/download/aria2-1.0.0.tar.bz2");
CPPUNIT_ASSERT_EQUAL(string("userDefinedUser:userDefinedPassword"),
factory.createAuthConfig(req)->getAuthText());
// CPPUNIT_ASSERT_EQUAL(string("aria2user:aria2password"),
// factory.createAuthConfig(req)->getAuthText());
}
void AuthConfigFactoryTest::testCreateAuthConfigForHttpProxy()
{
RequestHandle req = new Request();
req->setUrl("http://localhost/download/aria2-1.0.0.tar.bz2");
// with Netrc
NetrcHandle netrc = new Netrc();
netrc->addAuthenticator(new DefaultAuthenticator("default", "defaultpassword", "defaultaccount"));
Option option;
option.put(PREF_NO_NETRC, V_FALSE);
AuthConfigFactory factory(&option);
factory.setNetrc(netrc);
// netrc is not used in http proxy auth
CPPUNIT_ASSERT_EQUAL(string(":"),
factory.createAuthConfigForHttpProxy(req)->getAuthText());
option.put(PREF_HTTP_PROXY_USER, "userDefinedUser");
option.put(PREF_HTTP_PROXY_PASSWD, "userDefinedPassword");
CPPUNIT_ASSERT_EQUAL(string("userDefinedUser:userDefinedPassword"),
factory.createAuthConfigForHttpProxy(req)->getAuthText());
}
void AuthConfigFactoryTest::testCreateAuthConfig_ftp()
{
RequestHandle req = new Request();
req->setUrl("ftp://localhost/download/aria2-1.0.0.tar.bz2");
Option option;
option.put(PREF_NO_NETRC, V_FALSE);
AuthConfigFactory factory(&option);
// without auth info
CPPUNIT_ASSERT_EQUAL(string("anonymous:ARIA2USER@"),
factory.createAuthConfig(req)->getAuthText());
// with Netrc
NetrcHandle netrc = new Netrc();
netrc->addAuthenticator(new DefaultAuthenticator("default", "defaultpassword", "defaultaccount"));
factory.setNetrc(netrc);
CPPUNIT_ASSERT_EQUAL(string("default:defaultpassword"),
factory.createAuthConfig(req)->getAuthText());
// disable Netrc
option.put(PREF_NO_NETRC, V_TRUE);
CPPUNIT_ASSERT_EQUAL(string("anonymous:ARIA2USER@"),
factory.createAuthConfig(req)->getAuthText());
// with Netrc + user defined
option.put(PREF_NO_NETRC, V_FALSE);
option.put(PREF_FTP_USER, "userDefinedUser");
option.put(PREF_FTP_PASSWD, "userDefinedPassword");
CPPUNIT_ASSERT_EQUAL(string("userDefinedUser:userDefinedPassword"),
factory.createAuthConfig(req)->getAuthText());
// username and password in URI: disabled by default.
req->setUrl("ftp://aria2user:aria2password@localhost/download/aria2-1.0.0.tar.bz2");
CPPUNIT_ASSERT_EQUAL(string("aria2user:aria2password"),
factory.createAuthConfig(req)->getAuthText());
}

View File

@ -1,6 +1,6 @@
#include "HttpRequest.h" #include "HttpRequest.h"
#include "prefs.h" #include "prefs.h"
#include "RequestFactory.h" #include "AuthConfigFactory.h"
#include "PiecedSegment.h" #include "PiecedSegment.h"
#include "Piece.h" #include "Piece.h"
#include <cppunit/extensions/HelperMacros.h> #include <cppunit/extensions/HelperMacros.h>
@ -84,31 +84,30 @@ void HttpRequestTest::testGetEndByte()
void HttpRequestTest::testCreateRequest() void HttpRequestTest::testCreateRequest()
{ {
SharedHandle<Option> option = new Option(); Option option;
option->put(PREF_HTTP_AUTH_ENABLED, V_FALSE); option.put(PREF_HTTP_AUTH_ENABLED, V_FALSE);
option->put(PREF_HTTP_PROXY_ENABLED, V_FALSE); option.put(PREF_HTTP_PROXY_ENABLED, V_FALSE);
option->put(PREF_HTTP_PROXY_METHOD, V_TUNNEL); option.put(PREF_HTTP_PROXY_METHOD, V_TUNNEL);
option->put(PREF_HTTP_PROXY_AUTH_ENABLED, V_FALSE); option.put(PREF_HTTP_PROXY_AUTH_ENABLED, V_FALSE);
option->put(PREF_HTTP_USER, "aria2user"); option.put(PREF_HTTP_USER, "aria2user");
option->put(PREF_HTTP_PASSWD, "aria2passwd"); option.put(PREF_HTTP_PASSWD, "aria2passwd");
option->put(PREF_HTTP_PROXY_USER, "aria2proxyuser"); option.put(PREF_HTTP_PROXY_USER, "aria2proxyuser");
option->put(PREF_HTTP_PROXY_PASSWD, "aria2proxypasswd"); option.put(PREF_HTTP_PROXY_PASSWD, "aria2proxypasswd");
RequestFactory requestFactory;
requestFactory.setOption(option.get());
RequestHandle request = requestFactory.createRequest(); AuthConfigFactoryHandle authConfigFactory = new AuthConfigFactory(&option);
AuthConfigFactorySingleton::instance(authConfigFactory);
RequestHandle request = new Request();
request->setUrl("http://localhost:8080/archives/aria2-1.0.0.tar.bz2"); request->setUrl("http://localhost:8080/archives/aria2-1.0.0.tar.bz2");
SegmentHandle segment = new PiecedSegment(1024, new Piece(0, 1024)); SegmentHandle segment = new PiecedSegment(1024, new Piece(0, 1024));
HttpRequest httpRequest; HttpRequest httpRequest;
httpRequest.setRequest(request); httpRequest.setRequest(request);
httpRequest.setSegment(segment); httpRequest.setSegment(segment);
request->setKeepAlive(true); request->setKeepAlive(true);
string expectedText = "GET /archives/aria2-1.0.0.tar.bz2 HTTP/1.1\r\n" string expectedText = "GET /archives/aria2-1.0.0.tar.bz2 HTTP/1.1\r\n"
"User-Agent: aria2\r\n" "User-Agent: aria2\r\n"
"Accept: */*\r\n" "Accept: */*\r\n"
@ -158,7 +157,7 @@ void HttpRequestTest::testCreateRequest()
"Cache-Control: no-cache\r\n" "Cache-Control: no-cache\r\n"
"Range: bytes=1048576-2097151\r\n" "Range: bytes=1048576-2097151\r\n"
"\r\n"; "\r\n";
CPPUNIT_ASSERT_EQUAL(expectedText, httpRequest.createRequest()); CPPUNIT_ASSERT_EQUAL(expectedText, httpRequest.createRequest());
request->setKeepAlive(false); request->setKeepAlive(false);
@ -183,9 +182,9 @@ void HttpRequestTest::testCreateRequest()
httpRequest.setSegment(segment); httpRequest.setSegment(segment);
// enable http auth // enable http auth
option->put(PREF_HTTP_AUTH_ENABLED, V_TRUE); option.put(PREF_HTTP_AUTH_ENABLED, V_TRUE);
httpRequest.configure(option.get()); httpRequest.configure(&option);
expectedText = "GET /archives/aria2-1.0.0.tar.bz2 HTTP/1.1\r\n" expectedText = "GET /archives/aria2-1.0.0.tar.bz2 HTTP/1.1\r\n"
"User-Agent: aria2\r\n" "User-Agent: aria2\r\n"
@ -200,9 +199,9 @@ void HttpRequestTest::testCreateRequest()
CPPUNIT_ASSERT_EQUAL(expectedText, httpRequest.createRequest()); CPPUNIT_ASSERT_EQUAL(expectedText, httpRequest.createRequest());
// enable http proxy auth // enable http proxy auth
option->put(PREF_HTTP_PROXY_AUTH_ENABLED, V_TRUE); option.put(PREF_HTTP_PROXY_AUTH_ENABLED, V_TRUE);
httpRequest.configure(option.get()); httpRequest.configure(&option);
expectedText = "GET /archives/aria2-1.0.0.tar.bz2 HTTP/1.1\r\n" expectedText = "GET /archives/aria2-1.0.0.tar.bz2 HTTP/1.1\r\n"
"User-Agent: aria2\r\n" "User-Agent: aria2\r\n"
@ -216,9 +215,9 @@ void HttpRequestTest::testCreateRequest()
CPPUNIT_ASSERT_EQUAL(expectedText, httpRequest.createRequest()); CPPUNIT_ASSERT_EQUAL(expectedText, httpRequest.createRequest());
option->put(PREF_HTTP_PROXY_ENABLED, V_TRUE); option.put(PREF_HTTP_PROXY_ENABLED, V_TRUE);
httpRequest.configure(option.get()); httpRequest.configure(&option);
expectedText = "GET /archives/aria2-1.0.0.tar.bz2 HTTP/1.1\r\n" expectedText = "GET /archives/aria2-1.0.0.tar.bz2 HTTP/1.1\r\n"
"User-Agent: aria2\r\n" "User-Agent: aria2\r\n"
@ -232,9 +231,9 @@ void HttpRequestTest::testCreateRequest()
CPPUNIT_ASSERT_EQUAL(expectedText, httpRequest.createRequest()); CPPUNIT_ASSERT_EQUAL(expectedText, httpRequest.createRequest());
option->put(PREF_HTTP_PROXY_METHOD, V_GET); option.put(PREF_HTTP_PROXY_METHOD, V_GET);
httpRequest.configure(option.get()); httpRequest.configure(&option);
expectedText = "GET http://localhost:8080/archives/aria2-1.0.0.tar.bz2 HTTP/1.1\r\n" expectedText = "GET http://localhost:8080/archives/aria2-1.0.0.tar.bz2 HTTP/1.1\r\n"
"User-Agent: aria2\r\n" "User-Agent: aria2\r\n"
@ -268,9 +267,9 @@ void HttpRequestTest::testCreateRequest()
request->setKeepAlive(false); request->setKeepAlive(false);
option->put(PREF_HTTP_PROXY_AUTH_ENABLED, V_FALSE); option.put(PREF_HTTP_PROXY_AUTH_ENABLED, V_FALSE);
httpRequest.configure(option.get()); httpRequest.configure(&option);
expectedText = "GET http://localhost:8080/archives/aria2-1.0.0.tar.bz2 HTTP/1.1\r\n" expectedText = "GET http://localhost:8080/archives/aria2-1.0.0.tar.bz2 HTTP/1.1\r\n"
"User-Agent: aria2\r\n" "User-Agent: aria2\r\n"
@ -288,20 +287,20 @@ void HttpRequestTest::testCreateRequest()
void HttpRequestTest::testCreateRequest_ftp() void HttpRequestTest::testCreateRequest_ftp()
{ {
SharedHandle<Option> option = new Option(); Option option;
option->put(PREF_HTTP_AUTH_ENABLED, V_FALSE); option.put(PREF_HTTP_AUTH_ENABLED, V_FALSE);
option->put(PREF_HTTP_PROXY_ENABLED, V_FALSE); option.put(PREF_HTTP_PROXY_ENABLED, V_FALSE);
option->put(PREF_HTTP_PROXY_METHOD, V_TUNNEL); option.put(PREF_HTTP_PROXY_METHOD, V_TUNNEL);
option->put(PREF_HTTP_PROXY_AUTH_ENABLED, V_FALSE); option.put(PREF_HTTP_PROXY_AUTH_ENABLED, V_FALSE);
option->put(PREF_HTTP_USER, "aria2user"); option.put(PREF_HTTP_USER, "aria2user");
option->put(PREF_HTTP_PASSWD, "aria2passwd"); option.put(PREF_HTTP_PASSWD, "aria2passwd");
option->put(PREF_HTTP_PROXY_USER, "aria2proxyuser"); option.put(PREF_HTTP_PROXY_USER, "aria2proxyuser");
option->put(PREF_HTTP_PROXY_PASSWD, "aria2proxypasswd"); option.put(PREF_HTTP_PROXY_PASSWD, "aria2proxypasswd");
RequestFactory requestFactory; AuthConfigFactoryHandle authConfigFactory = new AuthConfigFactory(&option);
requestFactory.setOption(option.get()); AuthConfigFactorySingleton::instance(authConfigFactory);
RequestHandle request = requestFactory.createRequest(); RequestHandle request = new Request();
request->setUrl("ftp://localhost:8080/archives/aria2-1.0.0.tar.bz2"); request->setUrl("ftp://localhost:8080/archives/aria2-1.0.0.tar.bz2");
HttpRequest httpRequest; HttpRequest httpRequest;
@ -309,7 +308,7 @@ void HttpRequestTest::testCreateRequest_ftp()
httpRequest.setRequest(request); httpRequest.setRequest(request);
httpRequest.setSegment(segment); httpRequest.setSegment(segment);
httpRequest.configure(option.get()); httpRequest.configure(&option);
string expectedText = "GET ftp://localhost:8080/archives/aria2-1.0.0.tar.bz2 HTTP/1.1\r\n" string expectedText = "GET ftp://localhost:8080/archives/aria2-1.0.0.tar.bz2 HTTP/1.1\r\n"
"User-Agent: aria2\r\n" "User-Agent: aria2\r\n"
@ -323,11 +322,11 @@ void HttpRequestTest::testCreateRequest_ftp()
CPPUNIT_ASSERT_EQUAL(expectedText, httpRequest.createRequest()); CPPUNIT_ASSERT_EQUAL(expectedText, httpRequest.createRequest());
// How to enable HTTP proxy authorization in FTP download via HTTP proxy // How to enable HTTP proxy authorization in FTP download via HTTP proxy
option->put(PREF_HTTP_PROXY_ENABLED, V_TRUE); option.put(PREF_HTTP_PROXY_ENABLED, V_TRUE);
option->put(PREF_HTTP_PROXY_METHOD, V_GET); option.put(PREF_HTTP_PROXY_METHOD, V_GET);
option->put(PREF_HTTP_PROXY_AUTH_ENABLED, V_TRUE); option.put(PREF_HTTP_PROXY_AUTH_ENABLED, V_TRUE);
httpRequest.configure(option.get()); httpRequest.configure(&option);
expectedText = "GET ftp://localhost:8080/archives/aria2-1.0.0.tar.bz2 HTTP/1.1\r\n" expectedText = "GET ftp://localhost:8080/archives/aria2-1.0.0.tar.bz2 HTTP/1.1\r\n"
"User-Agent: aria2\r\n" "User-Agent: aria2\r\n"
@ -505,17 +504,17 @@ void HttpRequestTest::testIsRangeSatisfied()
void HttpRequestTest::testUserAgent() void HttpRequestTest::testUserAgent()
{ {
SharedHandle<Option> option = new Option(); Option option;
RequestFactory requestFactory;
requestFactory.setOption(option.get());
RequestHandle request = requestFactory.createRequest(); AuthConfigFactoryHandle authConfigFactory = new AuthConfigFactory(&option);
AuthConfigFactorySingleton::instance(authConfigFactory);
RequestHandle request = new Request();
request->setUrl("http://localhost:8080/archives/aria2-1.0.0.tar.bz2"); request->setUrl("http://localhost:8080/archives/aria2-1.0.0.tar.bz2");
SegmentHandle segment = new PiecedSegment(1024, new Piece(0, 1024)); SegmentHandle segment = new PiecedSegment(1024, new Piece(0, 1024));
HttpRequest httpRequest; HttpRequest httpRequest;
httpRequest.setRequest(request); httpRequest.setRequest(request);
httpRequest.setSegment(segment); httpRequest.setSegment(segment);
httpRequest.setUserAgent("aria2 (Linux)"); httpRequest.setUserAgent("aria2 (Linux)");

View File

@ -22,7 +22,7 @@ aria2c_SOURCES = AllTest.cc\
HttpRequestTest.cc\ HttpRequestTest.cc\
CookieBoxFactoryTest.cc\ CookieBoxFactoryTest.cc\
RequestGroupManTest.cc\ RequestGroupManTest.cc\
RequestFactoryTest.cc\ AuthConfigFactoryTest.cc\
NetrcAuthResolverTest.cc\ NetrcAuthResolverTest.cc\
DefaultAuthResolverTest.cc\ DefaultAuthResolverTest.cc\
OptionHandlerTest.cc\ OptionHandlerTest.cc\

View File

@ -121,7 +121,7 @@ am__aria2c_SOURCES_DIST = AllTest.cc PieceTest.cc \
FileUriListParserTest.cc StreamUriListParserTest.cc \ FileUriListParserTest.cc StreamUriListParserTest.cc \
HttpHeaderProcessorTest.cc CookieBoxTest.cc RequestTest.cc \ HttpHeaderProcessorTest.cc CookieBoxTest.cc RequestTest.cc \
CookieParserTest.cc HttpRequestTest.cc CookieBoxFactoryTest.cc \ CookieParserTest.cc HttpRequestTest.cc CookieBoxFactoryTest.cc \
RequestGroupManTest.cc RequestFactoryTest.cc \ RequestGroupManTest.cc AuthConfigFactoryTest.cc \
NetrcAuthResolverTest.cc DefaultAuthResolverTest.cc \ NetrcAuthResolverTest.cc DefaultAuthResolverTest.cc \
OptionHandlerTest.cc SegmentManTest.cc BitfieldManTest.cc \ OptionHandlerTest.cc SegmentManTest.cc BitfieldManTest.cc \
NetrcTest.cc SingletonHolderTest.cc HttpHeaderTest.cc \ NetrcTest.cc SingletonHolderTest.cc HttpHeaderTest.cc \
@ -215,7 +215,7 @@ am_aria2c_OBJECTS = AllTest.$(OBJEXT) PieceTest.$(OBJEXT) \
HttpHeaderProcessorTest.$(OBJEXT) CookieBoxTest.$(OBJEXT) \ HttpHeaderProcessorTest.$(OBJEXT) CookieBoxTest.$(OBJEXT) \
RequestTest.$(OBJEXT) CookieParserTest.$(OBJEXT) \ RequestTest.$(OBJEXT) CookieParserTest.$(OBJEXT) \
HttpRequestTest.$(OBJEXT) CookieBoxFactoryTest.$(OBJEXT) \ HttpRequestTest.$(OBJEXT) CookieBoxFactoryTest.$(OBJEXT) \
RequestGroupManTest.$(OBJEXT) RequestFactoryTest.$(OBJEXT) \ RequestGroupManTest.$(OBJEXT) AuthConfigFactoryTest.$(OBJEXT) \
NetrcAuthResolverTest.$(OBJEXT) \ NetrcAuthResolverTest.$(OBJEXT) \
DefaultAuthResolverTest.$(OBJEXT) OptionHandlerTest.$(OBJEXT) \ DefaultAuthResolverTest.$(OBJEXT) OptionHandlerTest.$(OBJEXT) \
SegmentManTest.$(OBJEXT) BitfieldManTest.$(OBJEXT) \ SegmentManTest.$(OBJEXT) BitfieldManTest.$(OBJEXT) \
@ -422,7 +422,7 @@ aria2c_SOURCES = AllTest.cc PieceTest.cc DefaultPieceStorageTest.cc \
FileUriListParserTest.cc StreamUriListParserTest.cc \ FileUriListParserTest.cc StreamUriListParserTest.cc \
HttpHeaderProcessorTest.cc CookieBoxTest.cc RequestTest.cc \ HttpHeaderProcessorTest.cc CookieBoxTest.cc RequestTest.cc \
CookieParserTest.cc HttpRequestTest.cc CookieBoxFactoryTest.cc \ CookieParserTest.cc HttpRequestTest.cc CookieBoxFactoryTest.cc \
RequestGroupManTest.cc RequestFactoryTest.cc \ RequestGroupManTest.cc AuthConfigFactoryTest.cc \
NetrcAuthResolverTest.cc DefaultAuthResolverTest.cc \ NetrcAuthResolverTest.cc DefaultAuthResolverTest.cc \
OptionHandlerTest.cc SegmentManTest.cc BitfieldManTest.cc \ OptionHandlerTest.cc SegmentManTest.cc BitfieldManTest.cc \
NetrcTest.cc SingletonHolderTest.cc HttpHeaderTest.cc \ NetrcTest.cc SingletonHolderTest.cc HttpHeaderTest.cc \
@ -497,6 +497,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AllTest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AllTest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AlphaNumberDecoratorTest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AlphaNumberDecoratorTest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AnnounceListTest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AnnounceListTest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AuthConfigFactoryTest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Base64Test.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Base64Test.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BitfieldManTest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BitfieldManTest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BtAllowedFastMessageTest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BtAllowedFastMessageTest.Po@am__quote@
@ -563,7 +564,6 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PeerMessageUtilTest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PeerMessageUtilTest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PeerTest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PeerTest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PieceTest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PieceTest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RequestFactoryTest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RequestGroupManTest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RequestGroupManTest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RequestGroupTest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RequestGroupTest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RequestTest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RequestTest.Po@am__quote@

View File

@ -1,128 +0,0 @@
#include "RequestFactory.h"
#include "prefs.h"
#include "NetrcAuthResolver.h"
#include "DefaultAuthResolver.h"
#include <cppunit/extensions/HelperMacros.h>
using namespace std;
class RequestFactoryTest : public CppUnit::TestFixture {
CPPUNIT_TEST_SUITE(RequestFactoryTest);
CPPUNIT_TEST(testCreateHttpAuthResolver_netrc);
CPPUNIT_TEST(testCreateHttpAuthResolver_def);
CPPUNIT_TEST(testCreateFtpAuthResolver_netrc);
CPPUNIT_TEST(testCreateFtpAuthResolver_def);
CPPUNIT_TEST(testCreateHttpProxyAuthResolver_netrc);
CPPUNIT_TEST(testCreateHttpProxyAuthResolver_def);
CPPUNIT_TEST_SUITE_END();
private:
NetrcHandle _netrc;
SharedHandle<Option> _option;
RequestFactoryHandle _factory;
public:
void setUp()
{
_netrc = new Netrc();
_option = new Option();
_factory = new RequestFactory();
_factory->setNetrc(_netrc);
_factory->setOption(_option.get());
}
void testCreateHttpAuthResolver_netrc();
void testCreateHttpAuthResolver_def();
void testCreateFtpAuthResolver_netrc();
void testCreateFtpAuthResolver_def();
void testCreateHttpProxyAuthResolver_netrc();
void testCreateHttpProxyAuthResolver_def();
};
CPPUNIT_TEST_SUITE_REGISTRATION( RequestFactoryTest );
void RequestFactoryTest::testCreateHttpAuthResolver_netrc()
{
_option->put(PREF_NO_NETRC, V_FALSE);
_option->put(PREF_HTTP_USER, "foo");
_option->put(PREF_HTTP_PASSWD, "bar");
DefaultAuthResolverHandle defResolver = _factory->createHttpAuthResolver();
CPPUNIT_ASSERT(!defResolver.isNull());
CPPUNIT_ASSERT(!defResolver->getUserDefinedAuthConfig().isNull());
CPPUNIT_ASSERT_EQUAL(string("foo:bar"),
defResolver->getUserDefinedAuthConfig()->getAuthText());
/*
NetrcAuthResolverHandle netrcResolver = _factory->createHttpAuthResolver();
CPPUNIT_ASSERT(!netrcResolver.isNull());
CPPUNIT_ASSERT(!netrcResolver->getNetrc().isNull());
CPPUNIT_ASSERT(netrcResolver->getUserDefinedAuthConfig().isNull());
*/
}
void RequestFactoryTest::testCreateHttpAuthResolver_def()
{
_option->put(PREF_NO_NETRC, V_TRUE);
_option->put(PREF_HTTP_USER, "foo");
_option->put(PREF_HTTP_PASSWD, "bar");
DefaultAuthResolverHandle defResolver = _factory->createHttpAuthResolver();
CPPUNIT_ASSERT(!defResolver.isNull());
CPPUNIT_ASSERT(!defResolver->getUserDefinedAuthConfig().isNull());
CPPUNIT_ASSERT_EQUAL(string("foo:bar"),
defResolver->getUserDefinedAuthConfig()->getAuthText());
}
void RequestFactoryTest::testCreateFtpAuthResolver_netrc()
{
_option->put(PREF_NO_NETRC, V_FALSE);
NetrcAuthResolverHandle netrcResolver = _factory->createFtpAuthResolver();
CPPUNIT_ASSERT(!netrcResolver.isNull());
CPPUNIT_ASSERT(!netrcResolver->getNetrc().isNull());
CPPUNIT_ASSERT(netrcResolver->getUserDefinedAuthConfig().isNull());
CPPUNIT_ASSERT_EQUAL(string("anonymous:ARIA2USER@"),
netrcResolver->getDefaultAuthConfig()->getAuthText());
}
void RequestFactoryTest::testCreateFtpAuthResolver_def()
{
_option->put(PREF_NO_NETRC, V_TRUE);
_option->put(PREF_FTP_USER, "foo");
_option->put(PREF_FTP_PASSWD, "bar");
DefaultAuthResolverHandle defResolver = _factory->createFtpAuthResolver();
CPPUNIT_ASSERT(!defResolver.isNull());
CPPUNIT_ASSERT(!defResolver->getUserDefinedAuthConfig().isNull());
CPPUNIT_ASSERT_EQUAL(string("foo:bar"),
defResolver->getUserDefinedAuthConfig()->getAuthText());
CPPUNIT_ASSERT_EQUAL(string("anonymous:ARIA2USER@"),
defResolver->getDefaultAuthConfig()->getAuthText());
}
void RequestFactoryTest::testCreateHttpProxyAuthResolver_netrc()
{
_option->put(PREF_NO_NETRC, V_FALSE);
_option->put(PREF_HTTP_PROXY_USER, "foo");
_option->put(PREF_HTTP_PROXY_PASSWD, "bar");
DefaultAuthResolverHandle defResolver = _factory->createHttpProxyAuthResolver();
CPPUNIT_ASSERT(!defResolver.isNull());
CPPUNIT_ASSERT(!defResolver->getUserDefinedAuthConfig().isNull());
CPPUNIT_ASSERT_EQUAL(string("foo:bar"),
defResolver->getUserDefinedAuthConfig()->getAuthText());
/*
NetrcAuthResolverHandle netrcResolver = _factory->createHttpProxyAuthResolver();
CPPUNIT_ASSERT(!netrcResolver.isNull());
CPPUNIT_ASSERT(!netrcResolver->getNetrc().isNull());
CPPUNIT_ASSERT(netrcResolver->getUserDefinedAuthConfig().isNull());
*/
}
void RequestFactoryTest::testCreateHttpProxyAuthResolver_def()
{
_option->put(PREF_NO_NETRC, V_TRUE);
_option->put(PREF_HTTP_PROXY_USER, "foo");
_option->put(PREF_HTTP_PROXY_PASSWD, "bar");
DefaultAuthResolverHandle defResolver = _factory->createHttpProxyAuthResolver();
CPPUNIT_ASSERT(!defResolver.isNull());
CPPUNIT_ASSERT(!defResolver->getUserDefinedAuthConfig().isNull());
CPPUNIT_ASSERT_EQUAL(string("foo:bar"),
defResolver->getUserDefinedAuthConfig()->getAuthText());
}

View File

@ -1,9 +1,9 @@
#include "RequestGroupMan.h" #include "RequestGroupMan.h"
#include "CUIDCounter.h" #include "CUIDCounter.h"
#include "prefs.h" #include "prefs.h"
#include "RequestFactory.h"
#include "SingleFileDownloadContext.h" #include "SingleFileDownloadContext.h"
#include "RequestGroup.h" #include "RequestGroup.h"
#include "Option.h"
#include <cppunit/extensions/HelperMacros.h> #include <cppunit/extensions/HelperMacros.h>
using namespace std; using namespace std;
@ -64,28 +64,4 @@ void RequestGroupManTest::testIsSameFileBeingDownloaded()
void RequestGroupManTest::testGetInitialCommands() void RequestGroupManTest::testGetInitialCommands()
{ {
// TODO implement later // TODO implement later
/*
Option option;
option.put(PREF_SPLIT, "1");
option.put(PREF_TIMEOUT, "10");
RequestFactoryHandle requestFactory = new RequestFactory();
requestFactory->setOption(&option);
RequestFactorySingletonHolder::instance(requestFactory);
RequestGroupMan gm;
RequestGroupHandle rg1 = new RequestGroup("aria2.tar.bz2.metalink",
&option);
RequestGroupHandle rg2 = new RequestGroup("http://localhost/aria2.tar.bz2",
&option);
gm.addRequestGroup(rg1);
gm.addRequestGroup(rg2);
ConsoleDownloadEngine e;
e.option = &option;
Commands commands = gm.getInitialCommands(&e);
CPPUNIT_ASSERT_EQUAL((size_t)1, commands.size());
*/
} }

View File

@ -23,16 +23,15 @@ class RequestTest:public CppUnit::TestFixture {
CPPUNIT_TEST(testSetUrl14); CPPUNIT_TEST(testSetUrl14);
CPPUNIT_TEST(testSetUrl15); CPPUNIT_TEST(testSetUrl15);
CPPUNIT_TEST(testSetUrl16); CPPUNIT_TEST(testSetUrl16);
CPPUNIT_TEST(testSetUrl_username);
CPPUNIT_TEST(testSetUrl_usernamePassword);
CPPUNIT_TEST(testSetUrl_zeroUsername);
CPPUNIT_TEST(testRedirectUrl); CPPUNIT_TEST(testRedirectUrl);
CPPUNIT_TEST(testRedirectUrl2); CPPUNIT_TEST(testRedirectUrl2);
CPPUNIT_TEST(testResetUrl); CPPUNIT_TEST(testResetUrl);
CPPUNIT_TEST(testSafeChar); CPPUNIT_TEST(testSafeChar);
CPPUNIT_TEST(testInnerLink); CPPUNIT_TEST(testInnerLink);
CPPUNIT_TEST(testMetalink); CPPUNIT_TEST(testMetalink);
CPPUNIT_TEST(testResolveHttpAuthConfig);
CPPUNIT_TEST(testResolveHttpAuthConfig_noCandidate);
CPPUNIT_TEST(testResolveHttpProxyAuthConfig);
CPPUNIT_TEST(testResolveFtpAuthConfig);
CPPUNIT_TEST_SUITE_END(); CPPUNIT_TEST_SUITE_END();
public: public:
@ -52,16 +51,15 @@ public:
void testSetUrl14(); void testSetUrl14();
void testSetUrl15(); void testSetUrl15();
void testSetUrl16(); void testSetUrl16();
void testSetUrl_username();
void testSetUrl_usernamePassword();
void testSetUrl_zeroUsername();
void testRedirectUrl(); void testRedirectUrl();
void testRedirectUrl2(); void testRedirectUrl2();
void testResetUrl(); void testResetUrl();
void testSafeChar(); void testSafeChar();
void testInnerLink(); void testInnerLink();
void testMetalink(); void testMetalink();
void testResolveHttpAuthConfig();
void testResolveHttpAuthConfig_noCandidate();
void testResolveHttpProxyAuthConfig();
void testResolveFtpAuthConfig();
}; };
@ -80,6 +78,8 @@ void RequestTest::testSetUrl1() {
CPPUNIT_ASSERT_EQUAL(string("aria.rednoah.com"), req.getHost()); CPPUNIT_ASSERT_EQUAL(string("aria.rednoah.com"), req.getHost());
CPPUNIT_ASSERT_EQUAL(string("/"), req.getDir()); CPPUNIT_ASSERT_EQUAL(string("/"), req.getDir());
CPPUNIT_ASSERT_EQUAL(string(""), req.getFile()); CPPUNIT_ASSERT_EQUAL(string(""), req.getFile());
CPPUNIT_ASSERT_EQUAL(string(""), req.getUsername());
CPPUNIT_ASSERT_EQUAL(string(""), req.getPassword());
} }
void RequestTest::testSetUrl2() { void RequestTest::testSetUrl2() {
@ -341,77 +341,66 @@ void RequestTest::testMetalink() {
#endif // ENABLE_METALINK #endif // ENABLE_METALINK
} }
void RequestTest::testResolveHttpAuthConfig() void RequestTest::testSetUrl_zeroUsername()
{ {
Request req; Request req;
req.setUrl("http://localhost/download/aria2-1.0.0.tar.bz2"); CPPUNIT_ASSERT(req.setUrl("ftp://@localhost/download/aria2-1.0.0.tar.bz2"));
// with DefaultAuthResolver CPPUNIT_ASSERT_EQUAL(string("ftp"), req.getProtocol());
DefaultAuthResolverHandle defaultAuthResolver = new DefaultAuthResolver(); CPPUNIT_ASSERT_EQUAL((int32_t)21, req.getPort());
req.setHttpAuthResolver(defaultAuthResolver); CPPUNIT_ASSERT_EQUAL(string("localhost"), req.getHost());
CPPUNIT_ASSERT(!req.resolveHttpAuthConfig().isNull()); CPPUNIT_ASSERT_EQUAL(string("/download"), req.getDir());
CPPUNIT_ASSERT_EQUAL(string(":"), CPPUNIT_ASSERT_EQUAL(string("aria2-1.0.0.tar.bz2"), req.getFile());
req.resolveHttpAuthConfig()->getAuthText()); CPPUNIT_ASSERT_EQUAL(string(""), req.getUsername());
CPPUNIT_ASSERT_EQUAL(string(""), req.getPassword());
// with Netrc CPPUNIT_ASSERT(req.setUrl("ftp://:@localhost/download/aria2-1.0.0.tar.bz2"));
NetrcHandle netrc = new Netrc(); CPPUNIT_ASSERT_EQUAL(string("ftp"), req.getProtocol());
netrc->addAuthenticator(new DefaultAuthenticator("default", "defaultpassword", "defaultaccount")); CPPUNIT_ASSERT_EQUAL((int32_t)21, req.getPort());
NetrcAuthResolverHandle netrcAuthResolver = new NetrcAuthResolver(); CPPUNIT_ASSERT_EQUAL(string("localhost"), req.getHost());
netrcAuthResolver->setNetrc(netrc); CPPUNIT_ASSERT_EQUAL(string("/download"), req.getDir());
req.setHttpAuthResolver(netrcAuthResolver); CPPUNIT_ASSERT_EQUAL(string("aria2-1.0.0.tar.bz2"), req.getFile());
AuthConfigHandle authConfig1 = req.resolveHttpAuthConfig(); CPPUNIT_ASSERT_EQUAL(string(""), req.getUsername());
CPPUNIT_ASSERT(!authConfig1.isNull()); CPPUNIT_ASSERT_EQUAL(string(""), req.getPassword());
CPPUNIT_ASSERT_EQUAL(string("default:defaultpassword"),
authConfig1->getAuthText()); CPPUNIT_ASSERT(req.setUrl("ftp://:pass@localhost/download/aria2-1.0.0.tar.bz2"));
CPPUNIT_ASSERT_EQUAL(string("ftp"), req.getProtocol());
CPPUNIT_ASSERT_EQUAL((int32_t)21, req.getPort());
CPPUNIT_ASSERT_EQUAL(string("localhost"), req.getHost());
CPPUNIT_ASSERT_EQUAL(string("/download"), req.getDir());
CPPUNIT_ASSERT_EQUAL(string("aria2-1.0.0.tar.bz2"), req.getFile());
CPPUNIT_ASSERT_EQUAL(string(""), req.getUsername());
CPPUNIT_ASSERT_EQUAL(string("pass"), req.getPassword());
// with Netrc + user defined
AuthConfigHandle authConfig =
new AuthConfig("userDefinedUser", "userDefinedPassword");
netrcAuthResolver->setUserDefinedAuthConfig(authConfig);
AuthConfigHandle authConfig2 = req.resolveHttpAuthConfig();
CPPUNIT_ASSERT(!authConfig2.isNull());
CPPUNIT_ASSERT_EQUAL(string("userDefinedUser:userDefinedPassword"),
authConfig2->getAuthText());
} }
void RequestTest::testResolveHttpAuthConfig_noCandidate() void RequestTest::testSetUrl_username()
{ {
Request req; Request req;
req.setUrl("http://localhost/download/aria2-1.0.0.tar.bz2"); CPPUNIT_ASSERT(req.setUrl("ftp://aria2user@localhost/download/aria2-1.0.0.tar.bz2"));
CPPUNIT_ASSERT_EQUAL(string("ftp"), req.getProtocol());
DefaultAuthResolverHandle defaultAuthResolver = new DefaultAuthResolver(); CPPUNIT_ASSERT_EQUAL((int32_t)21, req.getPort());
req.setHttpAuthResolver(defaultAuthResolver); CPPUNIT_ASSERT_EQUAL(string("localhost"), req.getHost());
CPPUNIT_ASSERT_EQUAL(string(":"), CPPUNIT_ASSERT_EQUAL(string("/download"), req.getDir());
req.resolveHttpAuthConfig()->getAuthText()); CPPUNIT_ASSERT_EQUAL(string("aria2-1.0.0.tar.bz2"), req.getFile());
CPPUNIT_ASSERT_EQUAL(string("aria2user"), req.getUsername());
CPPUNIT_ASSERT_EQUAL(string(""), req.getPassword());
} }
void RequestTest::testResolveHttpProxyAuthConfig() void RequestTest::testSetUrl_usernamePassword()
{ {
Request req; Request req;
req.setUrl("http://localhost/download/aria2-1.0.0.tar.bz2"); CPPUNIT_ASSERT(req.setUrl("ftp://aria2user%40:aria2pass%40@localhost/download/aria2-1.0.0.tar.bz2"));
// with Netrc CPPUNIT_ASSERT_EQUAL(string("ftp"), req.getProtocol());
NetrcHandle netrc = new Netrc(); CPPUNIT_ASSERT_EQUAL((int32_t)21, req.getPort());
netrc->addAuthenticator(new DefaultAuthenticator("default", "defaultpassword", "defaultaccount")); CPPUNIT_ASSERT_EQUAL(string("localhost"), req.getHost());
NetrcAuthResolverHandle netrcAuthResolver = new NetrcAuthResolver(); CPPUNIT_ASSERT_EQUAL(string("/download"), req.getDir());
netrcAuthResolver->setNetrc(netrc); CPPUNIT_ASSERT_EQUAL(string("aria2-1.0.0.tar.bz2"), req.getFile());
req.setHttpProxyAuthResolver(netrcAuthResolver); CPPUNIT_ASSERT_EQUAL(string("aria2user@"), req.getUsername());
AuthConfigHandle authConfig1 = req.resolveHttpProxyAuthConfig(); CPPUNIT_ASSERT_EQUAL(string("aria2pass@"), req.getPassword());
CPPUNIT_ASSERT(!authConfig1.isNull());
CPPUNIT_ASSERT_EQUAL(string("default:defaultpassword"), // make sure that after new url is set, username and password are updated.
authConfig1->getAuthText()); CPPUNIT_ASSERT(req.setUrl("ftp://localhost/download/aria2-1.0.0.tar.bz2"));
} CPPUNIT_ASSERT_EQUAL(string(""), req.getUsername());
CPPUNIT_ASSERT_EQUAL(string(""), req.getPassword());
void RequestTest::testResolveFtpAuthConfig()
{
Request req;
req.setUrl("http://localhost/download/aria2-1.0.0.tar.bz2");
// with Netrc
NetrcHandle netrc = new Netrc();
netrc->addAuthenticator(new DefaultAuthenticator("default", "defaultpassword", "defaultaccount"));
NetrcAuthResolverHandle netrcAuthResolver = new NetrcAuthResolver();
netrcAuthResolver->setNetrc(netrc);
req.setFtpAuthResolver(netrcAuthResolver);
AuthConfigHandle authConfig1 = req.resolveFtpAuthConfig();
CPPUNIT_ASSERT(!authConfig1.isNull());
CPPUNIT_ASSERT_EQUAL(string("default:defaultpassword"),
authConfig1->getAuthText());
} }