summaryrefslogtreecommitdiff
path: root/src/AbstractCommand.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2007-03-28 15:08:22 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2007-03-28 15:08:22 +0000
commit24d199632b1ceb4d1d359d054359c7b71110a80a (patch)
tree843509a47a5526bc89aaa245034db621fa2de5f4 /src/AbstractCommand.cc
parent843e641483429073d817067d316a3b732541891b (diff)
2007-03-28 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
To cache resolved hostname: * src/AbstractCommand.h, src/AbstractCommand.cc (resolveHostname): Put outside #ifdef ENABLE_ASYNC_DNS clause. Added dns cache. * src/FtpInitiateConnectionCommand.cc (executeInternal): Removed #ifdef ENABLE_ASYNC_DNS. * src/NameResolver.h, src/NameResolver.cc: Added synchronized NameResolver working without ares. * src/TorrentRequestInfo.cc (execute): Don't cache dns in torrent download. * src/HttpInitiateConnectionCommand.cc (executeInternal): Removed #ifdef ENABLE_ASYNC_DNS * src/DNSCache.h: New class. * src/UrlRequestInfo.cc (execute): Use dns cache
Diffstat (limited to 'src/AbstractCommand.cc')
-rw-r--r--src/AbstractCommand.cc63
1 files changed, 41 insertions, 22 deletions
diff --git a/src/AbstractCommand.cc b/src/AbstractCommand.cc
index d2014542..cfbdee81 100644
--- a/src/AbstractCommand.cc
+++ b/src/AbstractCommand.cc
@@ -40,6 +40,7 @@
#include "message.h"
#include "SleepCommand.h"
#include "prefs.h"
+#include "DNSCache.h"
AbstractCommand::AbstractCommand(int cuid,
const RequestHandle& req,
@@ -207,6 +208,46 @@ void AbstractCommand::setWriteCheckSocket(const SocketHandle& socket) {
}
}
+bool AbstractCommand::resolveHostname(const string& hostname,
+ const NameResolverHandle& resolver) {
+ string ipaddr = DNSCacheSingletonHolder::instance()->find(hostname);
+ if(ipaddr.empty()) {
+#ifdef ENABLE_ASYNC_DNS
+ switch(resolver->getStatus()) {
+ case NameResolver::STATUS_READY:
+ logger->info("CUID#%d - Resolving hostname %s", cuid, hostname.c_str());
+ resolver->resolve(hostname);
+ setNameResolverCheck(resolver);
+ return false;
+ case NameResolver::STATUS_SUCCESS:
+ logger->info("CUID#%d - Name resolution complete: %s -> %s", cuid,
+ hostname.c_str(), resolver->getAddrString().c_str());
+ DNSCacheSingletonHolder::instance()->put(hostname, resolver->getAddrString());
+ return true;
+ break;
+ case NameResolver::STATUS_ERROR:
+ throw new DlAbortEx("CUID#%d - Name resolution for %s failed:%s", cuid,
+ hostname.c_str(),
+ resolver->getError().c_str());
+ default:
+ return false;
+ }
+#else
+ logger->info("CUID#%d - Resolving hostname %s", cuid, hostname.c_str());
+ resolver->resolve(hostname);
+ logger->info("CUID#%d - Name resolution complete: %s -> %s", cuid,
+ hostname.c_str(), resolver->getAddrString().c_str());
+ DNSCacheSingletonHolder::instance()->put(hostname, resolver->getAddrString());
+ return true;
+#endif // ENABLE_ASYNC_DNS
+ } else {
+ logger->info("CUID#%d - DNS cache hit: %s -> %s", cuid,
+ hostname.c_str(), ipaddr.c_str());
+ resolver->setAddr(ipaddr);
+ return true;
+ }
+}
+
#ifdef ENABLE_ASYNC_DNS
void AbstractCommand::setNameResolverCheck(const NameResolverHandle& resolver) {
nameResolverCheck = true;
@@ -218,28 +259,6 @@ void AbstractCommand::disableNameResolverCheck(const NameResolverHandle& resolve
e->deleteNameResolverCheck(resolver, this);
}
-bool AbstractCommand::resolveHostname(const string& hostname,
- const NameResolverHandle& resolver) {
- switch(resolver->getStatus()) {
- case NameResolver::STATUS_READY:
- logger->info("CUID#%d - Resolving hostname %s", cuid, hostname.c_str());
- resolver->resolve(hostname);
- setNameResolverCheck(resolver);
- return false;
- case NameResolver::STATUS_SUCCESS:
- logger->info("CUID#%d - Name resolution complete: %s -> %s", cuid,
- hostname.c_str(), resolver->getAddrString().c_str());
- return true;
- break;
- case NameResolver::STATUS_ERROR:
- throw new DlAbortEx("CUID#%d - Name resolution for %s failed:%s", cuid,
- hostname.c_str(),
- resolver->getError().c_str());
- default:
- return false;
- }
-}
-
bool AbstractCommand::nameResolveFinished() const {
return false;
}