summaryrefslogtreecommitdiff
path: root/src/AbstractCommand.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2010-04-06 16:09:24 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2010-04-06 16:09:24 +0000
commitdd7590f927f73a887f579aba6f309e1539943e6d (patch)
treee01734e1403ea7ec0322930b9c422f4be8ef9897 /src/AbstractCommand.cc
parent538c463fc0f9b7c2be2fb641bce106e015c401dd (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.cc50
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