diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2010-04-06 16:09:24 +0000 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2010-04-06 16:09:24 +0000 |
| commit | dd7590f927f73a887f579aba6f309e1539943e6d (patch) | |
| tree | e01734e1403ea7ec0322930b9c422f4be8ef9897 /src/AbstractCommand.cc | |
| parent | 538c463fc0f9b7c2be2fb641bce106e015c401dd (diff) | |
2010-04-07 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Fixed the bug that FTP data connection is not established via
proxy when --ftp-proxy is defined and --ftp-pasv=true and
--proxy-method=tunnel.
* src/AbstractCommand.cc
* src/AbstractCommand.h
* src/FtpNegotiationCommand.cc
* src/FtpNegotiationCommand.h
* src/InitiateConnectionCommand.cc
Diffstat (limited to 'src/AbstractCommand.cc')
| -rw-r--r-- | src/AbstractCommand.cc | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/src/AbstractCommand.cc b/src/AbstractCommand.cc index 85b55475..abe36b8b 100644 --- a/src/AbstractCommand.cc +++ b/src/AbstractCommand.cc @@ -65,6 +65,7 @@ #include "LogFactory.h" #include "DownloadContext.h" #include "wallclock.h" +#include "NameResolver.h" namespace aria2 { @@ -604,8 +605,10 @@ bool AbstractCommand::asyncResolveHostname() { switch(_asyncNameResolver->getStatus()) { case AsyncNameResolver::STATUS_SUCCESS: + disableNameResolverCheck(_asyncNameResolver); return true; case AsyncNameResolver::STATUS_ERROR: + disableNameResolverCheck(_asyncNameResolver); if(!isProxyRequest(req->getProtocol(), getOption())) { e->_requestGroupMan->getOrCreateServerStat (req->getHost(), req->getProtocol())->setError(); @@ -647,6 +650,53 @@ bool AbstractCommand::nameResolveFinished() const { } #endif // ENABLE_ASYNC_DNS +std::string AbstractCommand::resolveHostname +(std::vector<std::string>& addrs, const std::string& hostname, uint16_t port) +{ + e->findAllCachedIPAddresses(std::back_inserter(addrs), hostname, port); + std::string ipaddr; + if(addrs.empty()) { +#ifdef ENABLE_ASYNC_DNS + if(getOption()->getAsBool(PREF_ASYNC_DNS)) { + if(!isAsyncNameResolverInitialized()) { + initAsyncNameResolver(hostname); + } + if(asyncResolveHostname()) { + addrs = getResolvedAddresses(); + } else { + return A2STR::NIL; + } + } else +#endif // ENABLE_ASYNC_DNS + { + NameResolver res; + res.setSocktype(SOCK_STREAM); + if(e->option->getAsBool(PREF_DISABLE_IPV6)) { + res.setFamily(AF_INET); + } + res.resolve(addrs, hostname); + } + if(logger->info()) { + logger->info(MSG_NAME_RESOLUTION_COMPLETE, util::itos(cuid).c_str(), + hostname.c_str(), + strjoin(addrs.begin(), addrs.end(), ", ").c_str()); + } + for(std::vector<std::string>::const_iterator i = addrs.begin(), + eoi = addrs.end(); i != eoi; ++i) { + e->cacheIPAddress(hostname, *i, port); + } + ipaddr = e->findCachedIPAddress(hostname, port); + } else { + ipaddr = addrs.front(); + if(logger->info()) { + logger->info(MSG_DNS_CACHE_HIT, + util::itos(cuid).c_str(), hostname.c_str(), + strjoin(addrs.begin(), addrs.end(), ", ").c_str()); + } + } + return ipaddr; +} + void AbstractCommand::prepareForNextAction(Command* nextCommand) { SharedHandle<CheckIntegrityEntry> entry |
