Use AsyncNameResolverMan in NameResolveCommand

pull/60/head
Tatsuhiro Tsujikawa 2013-04-01 01:56:51 +09:00
parent 12a3eaf233
commit 497c1dd8c9
2 changed files with 45 additions and 67 deletions

View File

@ -47,7 +47,7 @@
#include "UDPTrackerClient.h"
#include "BtRegistry.h"
#ifdef ENABLE_ASYNC_DNS
#include "AsyncNameResolver.h"
#include "AsyncNameResolverMan.h"
#endif // ENABLE_ASYNC_DNS
namespace aria2 {
@ -57,15 +57,21 @@ NameResolveCommand::NameResolveCommand
const SharedHandle<UDPTrackerRequest>& req)
: Command(cuid),
e_(e),
asyncNameResolverMan_(new AsyncNameResolverMan()),
req_(req)
{
#ifdef ENABLE_ASYNC_DNS
configureAsyncNameResolverMan(asyncNameResolverMan_.get(), e_->getOption());
// Currently we only utilize IPv4 DHT for UDP tracker
asyncNameResolverMan_->setIPv6(false);
#endif // ENABLE_ASYNC_DNS
setStatus(Command::STATUS_ONESHOT_REALTIME);
}
NameResolveCommand::~NameResolveCommand()
{
#ifdef ENABLE_ASYNC_DNS
disableNameResolverCheck(resolver_);
asyncNameResolverMan_->disableNameResolverCheck(e_, this);
#endif // ENABLE_ASYNC_DNS
}
@ -79,32 +85,16 @@ bool NameResolveCommand::execute()
onShutdown();
return true;
}
#ifdef ENABLE_ASYNC_DNS
if(!resolver_) {
int family = AF_INET;
resolver_.reset(new AsyncNameResolver(family
#ifdef HAVE_ARES_ADDR_NODE
, e_->getAsyncDNSServers()
#endif // HAVE_ARES_ADDR_NODE
));
}
#endif // ENABLE_ASYNC_DNS
std::string hostname = req_->remoteAddr;
const std::string& hostname = req_->remoteAddr;
std::vector<std::string> res;
if(util::isNumericHost(hostname)) {
res.push_back(hostname);
} else {
#ifdef ENABLE_ASYNC_DNS
if(e_->getOption()->getAsBool(PREF_ASYNC_DNS)) {
try {
if(resolveHostname(hostname, resolver_)) {
res = resolver_->getResolvedAddresses();
} else {
e_->addCommand(this);
return false;
}
} catch(RecoverableException& e) {
A2_LOG_ERROR_EX(EX_EXCEPTION_CAUGHT, e);
if(resolveHostname(res, hostname) == 0) {
e_->addCommand(this);
return false;
}
} else
#endif // ENABLE_ASYNC_DNS
@ -147,47 +137,39 @@ void NameResolveCommand::onSuccess
#ifdef ENABLE_ASYNC_DNS
bool NameResolveCommand::resolveHostname
(const std::string& hostname,
const SharedHandle<AsyncNameResolver>& resolver)
int NameResolveCommand::resolveHostname
(std::vector<std::string>& res, const std::string& hostname)
{
switch(resolver->getStatus()) {
case AsyncNameResolver::STATUS_READY:
A2_LOG_INFO(fmt(MSG_RESOLVING_HOSTNAME,
getCuid(),
hostname.c_str()));
resolver->resolve(hostname);
setNameResolverCheck(resolver);
return false;
case AsyncNameResolver::STATUS_SUCCESS:
A2_LOG_INFO(fmt(MSG_NAME_RESOLUTION_COMPLETE,
getCuid(),
resolver->getHostname().c_str(),
resolver->getResolvedAddresses().front().c_str()));
return true;
break;
case AsyncNameResolver::STATUS_ERROR:
throw DL_ABORT_EX
(fmt(MSG_NAME_RESOLUTION_FAILED,
getCuid(),
hostname.c_str(),
resolver->getError().c_str()));
default:
return false;
if(!asyncNameResolverMan_->started()) {
asyncNameResolverMan_->startAsync(hostname, e_, this);
return 0;
} else {
switch(asyncNameResolverMan_->getStatus()) {
case -1:
A2_LOG_INFO
(fmt(MSG_NAME_RESOLUTION_FAILED, getCuid(), hostname.c_str(),
asyncNameResolverMan_->getLastError().c_str()));
return -1;
case 0:
return 0;
case 1:
asyncNameResolverMan_->getResolvedAddress(res);
if(res.empty()) {
A2_LOG_INFO
(fmt(MSG_NAME_RESOLUTION_FAILED, getCuid(), hostname.c_str(),
"No address returned"));
return -1;
} else {
A2_LOG_INFO(fmt(MSG_NAME_RESOLUTION_COMPLETE,
getCuid(), hostname.c_str(), res.front().c_str()));
return 1;
}
}
}
// Unreachable
return 0;
}
void NameResolveCommand::setNameResolverCheck
(const SharedHandle<AsyncNameResolver>& resolver)
{
e_->addNameResolverCheck(resolver, this);
}
void NameResolveCommand::disableNameResolverCheck
(const SharedHandle<AsyncNameResolver>& resolver)
{
e_->deleteNameResolverCheck(resolver, this);
}
#endif // ENABLE_ASYNC_DNS
} // namespace aria2

View File

@ -47,7 +47,7 @@ namespace aria2 {
class DownloadEngine;
#ifdef ENABLE_ASYNC_DNS
class AsyncNameResolver;
class AsyncNameResolverMan;
#endif // ENABLE_ASYNC_DNS
struct UDPTrackerRequest;
@ -56,16 +56,12 @@ private:
DownloadEngine* e_;
#ifdef ENABLE_ASYNC_DNS
SharedHandle<AsyncNameResolver> resolver_;
SharedHandle<AsyncNameResolverMan> asyncNameResolverMan_;
#endif // ENABLE_ASYNC_DNS
#ifdef ENABLE_ASYNC_DNS
bool resolveHostname(const std::string& hostname,
const SharedHandle<AsyncNameResolver>& resolver);
void setNameResolverCheck(const SharedHandle<AsyncNameResolver>& resolver);
void disableNameResolverCheck(const SharedHandle<AsyncNameResolver>& resolver);
int resolveHostname(std::vector<std::string>& res,
const std::string& hostname);
#endif // ENABLE_ASYNC_DNS
SharedHandle<UDPTrackerRequest> req_;