Ver Fonte

2007-03-28 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>

	To add the command-line option which disables netrc support:
	* src/OptionHandlerFactory.cc
	(createOptionHandlers): Added PREF_NO_NETRC.
	* src/main.cc: Added -n option.
	* src/prefs.h (PREF_NO_NETRC): New definition.
	* src/RequestFactory.cc: Do not use netrc in ftp if 
PREF_NO_NETRC is
	V_TRUE.
	Note that netrc is not used in http, http proxy even if 
PREF_NO_NETRC
	is V_FALSE. This may get configurable in the future release.
	
	To clear peer's error status by time basis:
	* src/PeerAbstractCommand.cc
	(onAbort): Call Peer::startBadCondition().
	* src/Peer.h, src/Peer.cc
	(error): Removed.
	(_badConditionStartTime): New variable.
	(_badConditionInterval): New variable. Initialized to 10 
seconds.
	(startBadCondition): New function.
	(isGood): New function.
	* src/DefaultPeerStorage.cc
	(addPeer): Use Peer::isGood().
	(FindFinePeer): Use Peer::isGood().

	Always include port number in http request header:
	* src/HttpRequest.cc (getHostText): Always include port number 
in
	http request header.
Tatsuhiro Tsujikawa há 18 anos atrás
pai
commit
6e6ba30c60

+ 32 - 0
ChangeLog

@@ -1,3 +1,32 @@
+2007-03-28  Tatsuhiro Tsujikawa  <tujikawa at rednoah dot com>
+
+	To add the command-line option which disables netrc support:
+	* src/OptionHandlerFactory.cc
+	(createOptionHandlers): Added PREF_NO_NETRC.
+	* src/main.cc: Added -n option.
+	* src/prefs.h (PREF_NO_NETRC): New definition.
+	* src/RequestFactory.cc: Do not use netrc in ftp if PREF_NO_NETRC is
+	V_TRUE.
+	Note that netrc is not used in http, http proxy even if PREF_NO_NETRC
+	is V_FALSE. This may get configurable in the future release.
+	
+	To clear peer's error status by time basis:
+	* src/PeerAbstractCommand.cc
+	(onAbort): Call Peer::startBadCondition().
+	* src/Peer.h, src/Peer.cc
+	(error): Removed.
+	(_badConditionStartTime): New variable.
+	(_badConditionInterval): New variable. Initialized to 10 seconds.
+	(startBadCondition): New function.
+	(isGood): New function.
+	* src/DefaultPeerStorage.cc
+	(addPeer): Use Peer::isGood().
+	(FindFinePeer): Use Peer::isGood().
+
+	Always include port number in http request header:
+	* src/HttpRequest.cc (getHostText): Always include port number in
+	http request header.
+	
 2007-03-26  Tatsuhiro Tsujikawa  <tujikawa at rednoah dot com>
 
 	To the ability to read options from a config file:
@@ -30,6 +59,9 @@
 	* src/prefs.h (PREF_USER_AGENT): New definition.
 	* src/HttpRequestCommand.cc (executeInternal): Set user-agent option
 	parameter to HttpRequest object.
+	* src/AbstractProxyRequestCommand.cc
+	(executeInternal): Set user-agent option parameter to HttpRequest
+	object.
 	
 	Marged the patches from Dan Fandrich.
 	

+ 2 - 0
src/AbstractProxyRequestCommand.cc

@@ -34,6 +34,7 @@
 /* copyright --> */
 #include "AbstractProxyRequestCommand.h"
 #include "HttpConnection.h"
+#include "prefs.h"
 
 AbstractProxyRequestCommand::AbstractProxyRequestCommand(int cuid,
 							 const RequestHandle& req,
@@ -50,6 +51,7 @@ bool AbstractProxyRequestCommand::executeInternal() {
   socket->setBlockingMode();
 
   HttpRequestHandle httpRequest = new HttpRequest();
+  httpRequest->setUserAgent(e->option->get(PREF_USER_AGENT));
   httpRequest->setRequest(req);
   httpRequest->configure(e->option);
 

+ 2 - 2
src/DefaultPeerStorage.cc

@@ -60,7 +60,7 @@ bool DefaultPeerStorage::addPeer(const PeerHandle& peer) {
     return true;
   } else {
     const PeerHandle& peer = *itr;
-    if(peer->error >= MAX_PEER_ERROR || peer->cuid != 0) {
+    if(!peer->isGood() || peer->cuid != 0) {
       return false;
     } else {
       *itr = peer;
@@ -87,7 +87,7 @@ const Peers& DefaultPeerStorage::getPeers() {
 class FindFinePeer {
 public:
   bool operator()(const PeerHandle& peer) const {
-    return peer->cuid == 0 && peer->error < MAX_PEER_ERROR;
+    return peer->cuid == 0 && peer->isGood();
   }
 };
 

+ 1 - 1
src/HttpRequest.cc

@@ -65,7 +65,7 @@ bool HttpRequest::isRangeSatisfied(const RangeHandle& range) const
 
 string HttpRequest::getHostText(const string& host, in_port_t port) const
 {
-  return host+(port == 80 || port == 443 ? "" : ":"+Util::itos(port));
+  return host+":"+Util::itos(port);
 }
 
 string HttpRequest::createRequest() const

+ 6 - 0
src/NetrcAuthResolver.h

@@ -52,6 +52,12 @@ public:
   {
     _netrc = netrc;
   }
+
+  NetrcHandle getNetrc() const
+  {
+    return _netrc;
+  }
+      
 };
 
 typedef SharedHandle<NetrcAuthResolver> NetrcAuthResolverHandle;

+ 1 - 0
src/OptionHandlerFactory.cc

@@ -89,6 +89,7 @@ OptionHandlers OptionHandlerFactory::createOptionHandlers()
 						V_NONE, V_PREALLOC));
   handlers.push_back(new BooleanOptionHandler(PREF_CONTINUE));
   handlers.push_back(new DefaultOptionHandler(PREF_USER_AGENT));
+  handlers.push_back(new BooleanOptionHandler(PREF_NO_NETRC));
 
   return handlers;
 }

+ 13 - 2
src/Peer.cc

@@ -39,11 +39,12 @@
 Peer::Peer(string ipaddr, int port, int pieceLength, long long int totalLength):
   ipaddr(ipaddr),
   port(port),
-  error(0),
   sessionUploadLength(0),
   sessionDownloadLength(0),
   pieceLength(pieceLength),
-  active(false)
+  active(false),
+  _badConditionStartTime(0),
+  _badConditionInterval(10)
 {
   resetStatus();
   this->bitfield = BitfieldManFactory::getFactoryInstance()->
@@ -143,3 +144,13 @@ void Peer::setAllBitfield() {
 void Peer::updateLatency(int latency) {
   this->latency = (this->latency*20+latency*80)/200;
 }
+
+void Peer::startBadCondition()
+{
+  _badConditionStartTime.reset();
+}
+
+bool Peer::isGood() const
+{
+  return _badConditionStartTime.elapsed(_badConditionInterval);
+}

+ 7 - 1
src/Peer.h

@@ -39,6 +39,7 @@
 #include "BitfieldMan.h"
 #include "SharedHandle.h"
 #include "PeerStat.h"
+#include "TimeA2.h"
 #include <string.h>
 #include <string>
 
@@ -58,7 +59,6 @@ public:
   bool peerChoking;
   bool peerInterested;
   int tryCount;
-  int error;
   int cuid;
   bool chokingRequired;
   bool optUnchoking;
@@ -80,6 +80,8 @@ private:
   int latency;
   bool active;
   string id;
+  Time _badConditionStartTime;
+  int _badConditionInterval;
 public:
   Peer(string ipaddr, int port, int pieceLength, long long int totalLength);
 
@@ -196,6 +198,10 @@ public:
   const string& getId() const {
     return id;
   }
+
+  void startBadCondition();
+
+  bool isGood() const;
 };
 
 typedef SharedHandle<Peer> PeerHandle;

+ 1 - 5
src/PeerAbstractCommand.cc

@@ -97,11 +97,7 @@ bool PeerAbstractCommand::prepareForRetry(int wait) {
 }
 
 void PeerAbstractCommand::onAbort(RecoverableException* ex) {
-  if(peer->isSeeder()) {
-    peer->error++;
-  } else {
-    peer->error += MAX_PEER_ERROR;
-  }
+  peer->startBadCondition();
   peer->resetStatus();
 }
 

+ 33 - 17
src/RequestFactory.cc

@@ -34,7 +34,9 @@
 /* copyright --> */
 #include "RequestFactory.h"
 #include "prefs.h"
+#include "AbstractAuthResolver.h"
 #include "NetrcAuthResolver.h"
+#include "DefaultAuthResolver.h"
 
 RequestHandle RequestFactory::createRequest()
 {
@@ -58,29 +60,43 @@ AuthConfigHandle RequestFactory::createAuthConfig(const string& user, const stri
 
 AuthResolverHandle RequestFactory::createHttpAuthResolver()
 {
-  NetrcAuthResolverHandle authResolver = 0;
-  authResolver = new NetrcAuthResolver();
-  authResolver->setNetrc(_netrc);
-  authResolver->setUserDefinedAuthConfig(createAuthConfig(_option->get(PREF_HTTP_USER), _option->get(PREF_HTTP_PASSWD)));
-  return authResolver;		     
+  AbstractAuthResolverHandle resolver = 0;
+  if(true || _option->getAsBool(PREF_NO_NETRC)) {
+    resolver = new DefaultAuthResolver();
+  } else {
+    NetrcAuthResolverHandle authResolver = new NetrcAuthResolver();
+    authResolver->setNetrc(_netrc);
+    resolver = authResolver;
+  }
+  resolver->setUserDefinedAuthConfig(createAuthConfig(_option->get(PREF_HTTP_USER), _option->get(PREF_HTTP_PASSWD)));
+  return resolver;
 }
 
 AuthResolverHandle RequestFactory::createFtpAuthResolver()
 {
-  NetrcAuthResolverHandle authResolver = 0;
-  authResolver = new NetrcAuthResolver();
-  authResolver->setNetrc(_netrc);
-  authResolver->setUserDefinedAuthConfig(createAuthConfig(_option->get(PREF_FTP_USER), _option->get(PREF_FTP_PASSWD)));
-  authResolver->setDefaultAuthConfig(new AuthConfig("anonymous",
-							    "ARIA2USER@"));
-  return authResolver;
+  AbstractAuthResolverHandle resolver = 0;
+  if(_option->getAsBool(PREF_NO_NETRC)) {
+    resolver = new DefaultAuthResolver();
+  } else {
+    NetrcAuthResolverHandle authResolver = new NetrcAuthResolver();
+    authResolver->setNetrc(_netrc);
+    resolver = authResolver;
+  }
+  resolver->setUserDefinedAuthConfig(createAuthConfig(_option->get(PREF_FTP_USER), _option->get(PREF_FTP_PASSWD)));
+  resolver->setDefaultAuthConfig(new AuthConfig("anonymous", "ARIA2USER@"));
+  return resolver;
 }
 
 AuthResolverHandle RequestFactory::createHttpProxyAuthResolver()
 {
-  NetrcAuthResolverHandle authResolver = 0;
-  authResolver = new NetrcAuthResolver();
-  authResolver->setNetrc(_netrc);
-  authResolver->setUserDefinedAuthConfig(createAuthConfig(_option->get(PREF_HTTP_PROXY_USER), _option->get(PREF_HTTP_PROXY_PASSWD)));
-  return authResolver;
+  AbstractAuthResolverHandle resolver = 0;
+  if(true || _option->getAsBool(PREF_NO_NETRC)) {
+    resolver = new DefaultAuthResolver();
+  } else {
+    NetrcAuthResolverHandle authResolver = new NetrcAuthResolver();
+    authResolver->setNetrc(_netrc);
+    resolver = authResolver;
+  }
+  resolver->setUserDefinedAuthConfig(createAuthConfig(_option->get(PREF_HTTP_PROXY_USER), _option->get(PREF_HTTP_PROXY_PASSWD)));
+  return resolver;
 }

+ 4 - 0
src/TimeA2.cc

@@ -43,6 +43,10 @@ Time::Time(const Time& time) {
   tv = time.tv;
 }
 
+Time::Time(int sec) {
+  setTimeInSec(sec);
+}
+
 Time::~Time() {}
 
 void Time::reset() {

+ 1 - 0
src/TimeA2.h

@@ -48,6 +48,7 @@ public:
   // this object was created.
   Time();
   Time(const Time& time);
+  Time(int sec);
 
   Time& operator=(const Time& time) {
     if(this != &time) {

+ 2 - 2
src/UrlRequestInfo.cc

@@ -189,9 +189,9 @@ RequestInfos UrlRequestInfo::execute() {
     
     SharedHandle<ConsoleDownloadEngine> e(DownloadEngineFactory::newConsoleEngine(op, requests, reserved));
     
-    e->segmentMan->filename = hr->filename;
-    e->segmentMan->totalSize = hr->totalLength;
     if(hr->totalLength > 0) {
+      e->segmentMan->filename = hr->filename;
+      e->segmentMan->totalSize = hr->totalLength;
       e->segmentMan->downloadStarted = true;
     }
     

+ 7 - 1
src/main.cc

@@ -202,6 +202,7 @@ void showUsage() {
 	    "                              Currently this option is applicable to http(s)/\n"
 	    "                              ftp downloads.") << endl;
   cout << _(" -U, --user-agent=USER_AGENT  Set user agent for http(s) downloads.") << endl;
+  cout << _(" -n, --no-netrc               Disables netrc support.") << endl;
 #ifdef ENABLE_BITTORRENT
   cout << _(" -T, --torrent-file=TORRENT_FILE  The file path to .torrent file.") << endl;
   cout << _(" --follow-torrent=true|false  Setting this option to false prevents aria2 to\n"
@@ -352,6 +353,7 @@ int main(int argc, char* argv[]) {
   op->put(PREF_NETRC_PATH, Util::getHomeDir()+"/.netrc");
   op->put(PREF_CONTINUE, V_FALSE);
   op->put(PREF_USER_AGENT, "aria2");
+  op->put(PREF_NO_NETRC, V_FALSE);
   while(1) {
     int optIndex = 0;
     int lopt;
@@ -386,6 +388,7 @@ int main(int argc, char* argv[]) {
       { "realtime-chunk-checksum", required_argument, &lopt, 204 },
       { "continue", no_argument, 0, 'c' },
       { "user-agent", required_argument, 0, 'U' },
+      { "no-netrc", no_argument, 0, 'n' },
 #ifdef ENABLE_BITTORRENT
       { "torrent-file", required_argument, NULL, 'T' },
       { "listen-port", required_argument, &lopt, 15 },
@@ -413,7 +416,7 @@ int main(int argc, char* argv[]) {
       { "help", no_argument, NULL, 'h' },
       { 0, 0, 0, 0 }
     };
-    c = getopt_long(argc, argv, "Dd:o:l:s:pt:m:vhST:M:C:a:c", longOpts, &optIndex);
+    c = getopt_long(argc, argv, "Dd:o:l:s:pt:m:vhST:M:C:a:cU:n", longOpts, &optIndex);
     if(c == -1) {
       break;
     }
@@ -564,6 +567,9 @@ int main(int argc, char* argv[]) {
     case 'U':
       cmdstream << PREF_USER_AGENT << "=" << optarg << "\n";
       break;
+    case 'n':
+      cmdstream << PREF_NO_NETRC << "=" << V_TRUE << "\n";
+      break;
     case 'v':
       showVersion();
       exit(EXIT_SUCCESS);

+ 2 - 0
src/prefs.h

@@ -94,6 +94,8 @@
 #define PREF_NETRC_PATH "netrc-path"
 // value:
 #define PREF_CONTINUE "continue"
+// value:
+#define PREF_NO_NETRC "no-netrc"
 
 /**
  * FTP related preferences

+ 45 - 0
test/DefaultAuthResolverTest.cc

@@ -0,0 +1,45 @@
+#include "DefaultAuthResolver.h"
+#include "prefs.h"
+#include <cppunit/extensions/HelperMacros.h>
+
+using namespace std;
+
+class DefaultAuthResolverTest : public CppUnit::TestFixture {
+
+  CPPUNIT_TEST_SUITE(DefaultAuthResolverTest);
+  CPPUNIT_TEST(testResolveAuthConfig_without_userDefined);
+  CPPUNIT_TEST(testResolveAuthConfig_with_userDefined);
+  CPPUNIT_TEST_SUITE_END();
+private:
+  //NetrcHandle _netrc;
+  //SharedHandle<Option> _option;
+  DefaultAuthResolverHandle _resolver;
+public:
+  void setUp()
+  {
+    //_netrc = new Netrc();
+    //_option = new Option();
+    _resolver = new DefaultAuthResolver();
+    //_factory->setOption(_option.get());
+    _resolver->setDefaultAuthConfig(new AuthConfig("foo", "bar"));
+  }
+
+  void testResolveAuthConfig_without_userDefined();
+  void testResolveAuthConfig_with_userDefined();
+};
+
+
+CPPUNIT_TEST_SUITE_REGISTRATION( DefaultAuthResolverTest );
+
+void DefaultAuthResolverTest::testResolveAuthConfig_without_userDefined()
+{
+  AuthConfigHandle authConfig = _resolver->resolveAuthConfig("localhost");
+  CPPUNIT_ASSERT_EQUAL(string("foo:bar"), authConfig->getAuthText());
+}
+
+void DefaultAuthResolverTest::testResolveAuthConfig_with_userDefined()
+{
+  _resolver->setUserDefinedAuthConfig(new AuthConfig("myname", "mypasswd"));
+  AuthConfigHandle authConfig = _resolver->resolveAuthConfig("localhost");
+  CPPUNIT_ASSERT_EQUAL(string("myname:mypasswd"), authConfig->getAuthText());
+}

+ 7 - 7
test/HttpRequestTest.cc

@@ -335,7 +335,7 @@ void HttpRequestTest::testCreateRequest_with_cookie()
   string expectedText = "GET /archives/aria2-1.0.0.tar.bz2 HTTP/1.1\r\n"
     "User-Agent: aria2\r\n"
     "Accept: */*\r\n"
-    "Host: localhost\r\n"
+    "Host: localhost:80\r\n"
     "Pragma: no-cache\r\n"
     "Cache-Control: no-cache\r\n"
     "Cookie: name1=value1;\r\n"
@@ -348,7 +348,7 @@ void HttpRequestTest::testCreateRequest_with_cookie()
   expectedText = "GET /archives/download/aria2-1.0.0.tar.bz2 HTTP/1.1\r\n"
     "User-Agent: aria2\r\n"
     "Accept: */*\r\n"
-    "Host: localhost\r\n"
+    "Host: localhost:80\r\n"
     "Pragma: no-cache\r\n"
     "Cache-Control: no-cache\r\n"
     "Cookie: name1=value1;name2=value2;\r\n"
@@ -361,7 +361,7 @@ void HttpRequestTest::testCreateRequest_with_cookie()
   expectedText = "GET /archives/download/aria2-1.0.0.tar.bz2 HTTP/1.1\r\n"
     "User-Agent: aria2\r\n"
     "Accept: */*\r\n"
-    "Host: tt.localhost\r\n"
+    "Host: tt.localhost:80\r\n"
     "Pragma: no-cache\r\n"
     "Cache-Control: no-cache\r\n"
     "Cookie: name1=value1;name2=value2;name3=value3;\r\n"
@@ -374,7 +374,7 @@ void HttpRequestTest::testCreateRequest_with_cookie()
   expectedText = "GET /archives/download/aria2-1.0.0.tar.bz2 HTTP/1.1\r\n"
     "User-Agent: aria2\r\n"
     "Accept: */*\r\n"
-    "Host: tt.localhost\r\n"
+    "Host: tt.localhost:443\r\n"
     "Pragma: no-cache\r\n"
     "Cache-Control: no-cache\r\n"
     "Cookie: name1=value1;name2=value2;name3=value3;name4=value4;\r\n"
@@ -387,7 +387,7 @@ void HttpRequestTest::testCreateRequest_with_cookie()
 void HttpRequestTest::testCreateProxyRequest()
 {
   RequestHandle request = new Request();
-  request->setUrl("http://localhost:8080/archives/aria2-1.0.0.tar.bz2");
+  request->setUrl("http://localhost/archives/aria2-1.0.0.tar.bz2");
   SegmentHandle segment = new Segment();
 
   HttpRequest httpRequest;
@@ -395,10 +395,10 @@ void HttpRequestTest::testCreateProxyRequest()
   httpRequest.setRequest(request);
   httpRequest.setSegment(segment);
 
-  string expectedText = "CONNECT localhost:8080 HTTP/1.1\r\n"
+  string expectedText = "CONNECT localhost:80 HTTP/1.1\r\n"
     "User-Agent: aria2\r\n"
     "Proxy-Connection: close\r\n"
-    "Host: localhost:8080\r\n"
+    "Host: localhost:80\r\n"
     "\r\n";
 
   CPPUNIT_ASSERT_EQUAL(expectedText, httpRequest.createProxyRequest());

+ 5 - 2
test/Makefile.am

@@ -1,13 +1,16 @@
 TESTS = aria2c
 check_PROGRAMS = $(TESTS)
 aria2c_SOURCES = AllTest.cc\
+	RequestFactoryTest.cc\
+	NetrcAuthResolverTest.cc\
+	DefaultAuthResolverTest.cc\
+	RequestTest.cc\
+	HttpRequestTest.cc
 	UtilTest.cc\
 	OptionHandlerTest.cc\
 	SegmentManTest.cc\
 	BitfieldManTest.cc\
 	GlowFileAllocatorTest.cc\
-	RequestTest.cc\
-	HttpRequestTest.cc\
 	NetrcTest.cc\
 	SingletonHolderTest.cc\
 	HttpHeaderTest.cc\

+ 73 - 173
test/Makefile.in

@@ -57,45 +57,7 @@ mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
 am__EXEEXT_1 = aria2c$(EXEEXT)
-am_aria2c_OBJECTS = AllTest.$(OBJEXT) UtilTest.$(OBJEXT) \
-	OptionHandlerTest.$(OBJEXT) SegmentManTest.$(OBJEXT) \
-	BitfieldManTest.$(OBJEXT) GlowFileAllocatorTest.$(OBJEXT) \
-	RequestTest.$(OBJEXT) HttpRequestTest.$(OBJEXT) \
-	NetrcTest.$(OBJEXT) SingletonHolderTest.$(OBJEXT) \
-	HttpHeaderTest.$(OBJEXT) HttpResponseTest.$(OBJEXT) \
-	SharedHandleTest.$(OBJEXT) ChunkedEncodingTest.$(OBJEXT) \
-	FileTest.$(OBJEXT) OptionTest.$(OBJEXT) Base64Test.$(OBJEXT) \
-	CookieBoxTest.$(OBJEXT) DataTest.$(OBJEXT) \
-	DictionaryTest.$(OBJEXT) ListTest.$(OBJEXT) \
-	MetaFileUtilTest.$(OBJEXT) ShaVisitorTest.$(OBJEXT) \
-	PeerMessageUtilTest.$(OBJEXT) DefaultDiskWriterTest.$(OBJEXT) \
-	MultiDiskAdaptorTest.$(OBJEXT) \
-	Xml2MetalinkProcessorTest.$(OBJEXT) MetalinkerTest.$(OBJEXT) \
-	MetalinkEntryTest.$(OBJEXT) FeatureConfigTest.$(OBJEXT) \
-	ShareRatioSeedCriteriaTest.$(OBJEXT) \
-	TimeSeedCriteriaTest.$(OBJEXT) SpeedCalcTest.$(OBJEXT) \
-	DefaultPeerListProcessorTest.$(OBJEXT) \
-	AnnounceListTest.$(OBJEXT) TrackerWatcherCommandTest.$(OBJEXT) \
-	DefaultBtContextTest.$(OBJEXT) \
-	DefaultPieceStorageTest.$(OBJEXT) \
-	DefaultPeerStorageTest.$(OBJEXT) \
-	DefaultBtAnnounceTest.$(OBJEXT) BtRegistryTest.$(OBJEXT) \
-	DefaultBtMessageDispatcherTest.$(OBJEXT) \
-	DefaultBtRequestFactoryTest.$(OBJEXT) PeerTest.$(OBJEXT) \
-	BtAllowedFastMessageTest.$(OBJEXT) \
-	BtBitfieldMessageTest.$(OBJEXT) BtCancelMessageTest.$(OBJEXT) \
-	BtChokeMessageTest.$(OBJEXT) BtHaveAllMessageTest.$(OBJEXT) \
-	BtHaveMessageTest.$(OBJEXT) BtHaveNoneMessageTest.$(OBJEXT) \
-	BtInterestedMessageTest.$(OBJEXT) \
-	BtKeepAliveMessageTest.$(OBJEXT) \
-	BtNotInterestedMessageTest.$(OBJEXT) \
-	BtPieceMessageTest.$(OBJEXT) BtPortMessageTest.$(OBJEXT) \
-	BtRejectMessageTest.$(OBJEXT) BtRequestMessageTest.$(OBJEXT) \
-	BtSuggestPieceMessageTest.$(OBJEXT) \
-	BtUnchokeMessageTest.$(OBJEXT) \
-	BtHandshakeMessageTest.$(OBJEXT) \
-	ConsoleFileAllocationMonitorTest.$(OBJEXT) \
-	ChunkChecksumValidatorTest.$(OBJEXT)
+am_aria2c_OBJECTS = AllTest.$(OBJEXT) RequestFactoryTest.$(OBJEXT)
 aria2c_OBJECTS = $(am_aria2c_OBJECTS)
 am__DEPENDENCIES_1 =
 aria2c_DEPENDENCIES = ../src/libaria2c.a $(am__DEPENDENCIES_1)
@@ -107,10 +69,6 @@ CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
 CXXLD = $(CXX)
 CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
 	-o $@
-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
-	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-CCLD = $(CC)
-LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
 SOURCES = $(aria2c_SOURCES)
 DIST_SOURCES = $(aria2c_SOURCES)
 ETAGS = etags
@@ -260,74 +218,77 @@ sysconfdir = @sysconfdir@
 target_alias = @target_alias@
 TESTS = aria2c
 aria2c_SOURCES = AllTest.cc\
-	UtilTest.cc\
-	OptionHandlerTest.cc\
-	SegmentManTest.cc\
-	BitfieldManTest.cc\
-	GlowFileAllocatorTest.cc\
-	RequestTest.cc\
-	HttpRequestTest.cc\
-	NetrcTest.cc\
-	SingletonHolderTest.cc\
-	HttpHeaderTest.cc\
-	HttpResponseTest.cc\
-	SharedHandleTest.cc\
-	ChunkedEncodingTest.cc\
-	FileTest.cc\
-	OptionTest.cc\
-	Base64Test.cc\
-	CookieBoxTest.cc\
-	DataTest.cc\
-	DictionaryTest.cc\
-	ListTest.cc\
-	MetaFileUtilTest.cc\
-	ShaVisitorTest.cc\
-	PeerMessageUtilTest.cc\
-	DefaultDiskWriterTest.cc\
-	MultiDiskAdaptorTest.cc\
-	Xml2MetalinkProcessorTest.cc\
-	MetalinkerTest.cc\
-	MetalinkEntryTest.cc\
-	FeatureConfigTest.cc\
-	ShareRatioSeedCriteriaTest.cc\
-	TimeSeedCriteriaTest.cc\
-	SpeedCalcTest.cc\
-	DefaultPeerListProcessorTest.cc\
-	AnnounceListTest.cc\
-	TrackerWatcherCommandTest.cc\
-	DefaultBtContextTest.cc\
-	DefaultPieceStorageTest.cc\
-	DefaultPeerStorageTest.cc\
-	DefaultBtAnnounceTest.cc\
-	BtRegistryTest.cc\
-	DefaultBtMessageDispatcherTest.cc\
-	MockPeerStorage.h\
-	DefaultBtRequestFactoryTest.cc\
-	PeerTest.cc\
-	BtAllowedFastMessageTest.cc\
-	BtBitfieldMessageTest.cc\
-	BtCancelMessageTest.cc\
-	BtChokeMessageTest.cc\
-	BtHaveAllMessageTest.cc\
-	BtHaveMessageTest.cc\
-	BtHaveNoneMessageTest.cc\
-	BtInterestedMessageTest.cc\
-	BtKeepAliveMessageTest.cc\
-	BtNotInterestedMessageTest.cc\
-	BtPieceMessageTest.cc\
-	BtPortMessageTest.cc\
-	BtRejectMessageTest.cc\
-	BtRequestMessageTest.cc\
-	BtSuggestPieceMessageTest.cc\
-	BtUnchokeMessageTest.cc\
-	BtHandshakeMessageTest.cc\
-	MockBtMessageDispatcher.h\
-	FixedNumberRandomizer.h\
-	MockBtMessageFactory.h\
-	MockBtMessage.h\
-	ConsoleFileAllocationMonitorTest.cc\
-	ChunkChecksumValidatorTest.cc
-
+	RequestFactoryTest.cc
+
+# 	NetrcAuthResolverTest.cc\
+# 	DefaultAuthResolverTest.cc\
+# 	RequestTest.cc\
+# 	HttpRequestTest.cc
+# 	UtilTest.cc\
+# 	OptionHandlerTest.cc\
+# 	SegmentManTest.cc\
+# 	BitfieldManTest.cc\
+# 	GlowFileAllocatorTest.cc\
+# 	NetrcTest.cc\
+# 	SingletonHolderTest.cc\
+# 	HttpHeaderTest.cc\
+# 	HttpResponseTest.cc\
+# 	SharedHandleTest.cc\
+# 	ChunkedEncodingTest.cc\
+# 	FileTest.cc\
+# 	OptionTest.cc\
+# 	Base64Test.cc\
+# 	CookieBoxTest.cc\
+# 	DataTest.cc\
+# 	DictionaryTest.cc\
+# 	ListTest.cc\
+# 	MetaFileUtilTest.cc\
+# 	ShaVisitorTest.cc\
+# 	PeerMessageUtilTest.cc\
+# 	DefaultDiskWriterTest.cc\
+# 	MultiDiskAdaptorTest.cc\
+# 	Xml2MetalinkProcessorTest.cc\
+# 	MetalinkerTest.cc\
+# 	MetalinkEntryTest.cc\
+# 	FeatureConfigTest.cc\
+# 	ShareRatioSeedCriteriaTest.cc\
+# 	TimeSeedCriteriaTest.cc\
+# 	SpeedCalcTest.cc\
+# 	DefaultPeerListProcessorTest.cc\
+# 	AnnounceListTest.cc\
+# 	TrackerWatcherCommandTest.cc\
+# 	DefaultBtContextTest.cc\
+# 	DefaultPieceStorageTest.cc\
+# 	DefaultPeerStorageTest.cc\
+# 	DefaultBtAnnounceTest.cc\
+# 	BtRegistryTest.cc\
+# 	DefaultBtMessageDispatcherTest.cc\
+# 	MockPeerStorage.h\
+# 	DefaultBtRequestFactoryTest.cc\
+# 	PeerTest.cc\
+# 	BtAllowedFastMessageTest.cc\
+# 	BtBitfieldMessageTest.cc\
+# 	BtCancelMessageTest.cc\
+# 	BtChokeMessageTest.cc\
+# 	BtHaveAllMessageTest.cc\
+# 	BtHaveMessageTest.cc\
+# 	BtHaveNoneMessageTest.cc\
+# 	BtInterestedMessageTest.cc\
+# 	BtKeepAliveMessageTest.cc\
+# 	BtNotInterestedMessageTest.cc\
+# 	BtPieceMessageTest.cc\
+# 	BtPortMessageTest.cc\
+# 	BtRejectMessageTest.cc\
+# 	BtRequestMessageTest.cc\
+# 	BtSuggestPieceMessageTest.cc\
+# 	BtUnchokeMessageTest.cc\
+# 	BtHandshakeMessageTest.cc\
+# 	MockBtMessageDispatcher.h\
+# 	FixedNumberRandomizer.h\
+# 	MockBtMessageFactory.h\
+# 	MockBtMessage.h\
+# 	ConsoleFileAllocationMonitorTest.cc\
+# 	ChunkChecksumValidatorTest.cc
 #aria2c_CXXFLAGS = ${CPPUNIT_CFLAGS} -I../src -I../lib -Wall -D_FILE_OFFSET_BITS=64
 #aria2c_LDFLAGS = ${CPPUNIT_LIBS}
 aria2c_LDADD = ../src/libaria2c.a\
@@ -390,68 +351,7 @@ distclean-compile:
 	-rm -f *.tab.c
 
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AllTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AnnounceListTest.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)/BtAllowedFastMessageTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BtBitfieldMessageTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BtCancelMessageTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BtChokeMessageTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BtHandshakeMessageTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BtHaveAllMessageTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BtHaveMessageTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BtHaveNoneMessageTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BtInterestedMessageTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BtKeepAliveMessageTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BtNotInterestedMessageTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BtPieceMessageTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BtPortMessageTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BtRegistryTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BtRejectMessageTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BtRequestMessageTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BtSuggestPieceMessageTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/BtUnchokeMessageTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ChunkChecksumValidatorTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ChunkedEncodingTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ConsoleFileAllocationMonitorTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CookieBoxTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DataTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DefaultBtAnnounceTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DefaultBtContextTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DefaultBtMessageDispatcherTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DefaultBtRequestFactoryTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DefaultDiskWriterTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DefaultPeerListProcessorTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DefaultPeerStorageTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DefaultPieceStorageTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/DictionaryTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FeatureConfigTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FileTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GlowFileAllocatorTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/HttpHeaderTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/HttpRequestTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/HttpResponseTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ListTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MetaFileUtilTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MetalinkEntryTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MetalinkerTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MultiDiskAdaptorTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/NetrcTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OptionHandlerTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OptionTest.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)/RequestTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SegmentManTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ShaVisitorTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ShareRatioSeedCriteriaTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SharedHandleTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SingletonHolderTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SpeedCalcTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TimeSeedCriteriaTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TrackerWatcherCommandTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/UtilTest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Xml2MetalinkProcessorTest.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RequestFactoryTest.Po@am__quote@
 
 .cc.o:
 @am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \

+ 63 - 0
test/NetrcAuthResolverTest.cc

@@ -0,0 +1,63 @@
+#include "NetrcAuthResolver.h"
+#include "prefs.h"
+#include <cppunit/extensions/HelperMacros.h>
+
+using namespace std;
+
+class NetrcAuthResolverTest : public CppUnit::TestFixture {
+
+  CPPUNIT_TEST_SUITE(NetrcAuthResolverTest);
+  CPPUNIT_TEST(testResolveAuthConfig_without_userDefined);
+  CPPUNIT_TEST(testResolveAuthConfig_with_userDefined);
+  CPPUNIT_TEST_SUITE_END();
+private:
+  NetrcHandle _netrc;
+  //SharedHandle<Option> _option;
+  NetrcAuthResolverHandle _resolver;
+public:
+  void setUp()
+  {
+    _netrc = new Netrc();
+    _netrc->addAuthenticator(new Authenticator("localhost", "name", "passwd", "account"));
+    _netrc->addAuthenticator(new DefaultAuthenticator("default", "defaultpasswd", "defaultaccount"));
+
+    //_option = new Option();
+    _resolver = new NetrcAuthResolver();
+    _resolver->setNetrc(_netrc);
+    _resolver->setDefaultAuthConfig(new AuthConfig("foo", "bar"));
+  }
+
+  void testResolveAuthConfig_without_userDefined();
+  void testResolveAuthConfig_with_userDefined();
+};
+
+
+CPPUNIT_TEST_SUITE_REGISTRATION( NetrcAuthResolverTest );
+
+void NetrcAuthResolverTest::testResolveAuthConfig_without_userDefined()
+{
+  AuthConfigHandle authConfig = _resolver->resolveAuthConfig("localhost");
+  CPPUNIT_ASSERT_EQUAL(string("name:passwd"), authConfig->getAuthText());
+
+  authConfig = _resolver->resolveAuthConfig("mymachine");
+  CPPUNIT_ASSERT_EQUAL(string("default:defaultpasswd"), authConfig->getAuthText());
+
+  _resolver->setNetrc(0);
+  authConfig = _resolver->resolveAuthConfig("localhost");
+  CPPUNIT_ASSERT_EQUAL(string("foo:bar"), authConfig->getAuthText());
+
+}
+
+void NetrcAuthResolverTest::testResolveAuthConfig_with_userDefined()
+{
+  _resolver->setUserDefinedAuthConfig(new AuthConfig("myname", "mypasswd"));
+  AuthConfigHandle authConfig = _resolver->resolveAuthConfig("localhost");
+  CPPUNIT_ASSERT_EQUAL(string("myname:mypasswd"), authConfig->getAuthText());
+
+  authConfig = _resolver->resolveAuthConfig("mymachine");
+  CPPUNIT_ASSERT_EQUAL(string("myname:mypasswd"), authConfig->getAuthText());
+
+  _resolver->setNetrc(0);
+  authConfig = _resolver->resolveAuthConfig("mymachine");
+  CPPUNIT_ASSERT_EQUAL(string("myname:mypasswd"), authConfig->getAuthText());
+}

+ 128 - 0
test/RequestFactoryTest.cc

@@ -0,0 +1,128 @@
+#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());
+}
+