+BLACKLISTS = (
+ "access.redhawk.org",
+ "all.spamblock.unit.liu.se",
+ "b.barracudacentral.org",
+ "bl.deadbeef.com",
+ #"bl.emailbasura.org",
+ "bl.spamcannibal.org",
+ "bl.spamcop.net",
+ "blackholes.five-ten-sg.com",
+ #"blackholes.mail-abuse.org",
+ "blacklist.sci.kun.nl",
+ "blacklist.woody.ch",
+ "bogons.cymru.com",
+ "bsb.spamlookup.net",
+ "cbl.abuseat.org",
+ #"cbl.anti-spam.org.cn",
+ #"cblless.anti-spam.org.cn",
+ #"cblplus.anti-spam.org.cn",
+ #"cdl.anti-spam.org.cn",
+ #"combined.njabl.org",
+ "combined.rbl.msrbl.net",
+ "csi.cloudmark.com",
+ "db.wpbl.info",
+ #"dialups.mail-abuse.org",
+ "dnsbl-1.uceprotect.net",
+ "dnsbl-2.uceprotect.net",
+ "dnsbl-3.uceprotect.net",
+ "dnsbl.abuse.ch",
+ "dnsbl.cyberlogic.net",
+ "dnsbl.dronebl.org",
+ "dnsbl.inps.de",
+ "dnsbl.kempt.net",
+ #"dnsbl.njabl.org",
+ "dnsbl.sorbs.net",
+ "dob.sibl.support-intelligence.net",
+ "drone.abuse.ch",
+ "dsn.rfc-ignorant.org",
+ "duinv.aupads.org",
+ #"dul.blackhole.cantv.net",
+ "dul.dnsbl.sorbs.net",
+ "vdul.ru",
+ "dyna.spamrats.com",
+ "dynablock.sorbs.net",
+ #"dyndns.rbl.jp",
+ "dynip.rothen.com",
+ "forbidden.icm.edu.pl",
+ "http.dnsbl.sorbs.net",
+ "httpbl.abuse.ch",
+ "images.rbl.msrbl.net",
+ "ips.backscatterer.org",
+ "ix.dnsbl.manitu.net",
+ "korea.services.net",
+ "mail.people.it",
+ "misc.dnsbl.sorbs.net",
+ "multi.surbl.org",
+ "netblock.pedantic.org",
+ "noptr.spamrats.com",
+ "opm.tornevall.org",
+ "orvedb.aupads.org",
+ "pbl.spamhaus.org",
+ "phishing.rbl.msrbl.net",
+ "psbl.surriel.com",
+ "query.senderbase.org",
+ #"rbl-plus.mail-abuse.org",
+ "rbl.efnetrbl.org",
+ "rbl.interserver.net",
+ "rbl.spamlab.com",
+ "rbl.suresupport.com",
+ "relays.bl.gweep.ca",
+ "relays.bl.kundenserver.de",
+ #"relays.mail-abuse.org",
+ "relays.nether.net",
+ "residential.block.transip.nl",
+ #"rot.blackhole.cantv.net",
+ "sbl.spamhaus.org",
+ #"short.rbl.jp",
+ "smtp.dnsbl.sorbs.net",
+ "socks.dnsbl.sorbs.net",
+ "spam.abuse.ch",
+ "spam.dnsbl.sorbs.net",
+ "spam.rbl.msrbl.net",
+ "spam.spamrats.com",
+ "spamguard.leadmon.net",
+ "spamlist.or.kr",
+ "spamrbl.imp.ch",
+ "tor.dan.me.uk",
+ "ubl.lashback.com",
+ "ubl.unsubscore.com",
+ "uribl.swinog.ch",
+ #"url.rbl.jp",
+ "virbl.bit.nl",
+ #"virus.rbl.jp",
+ "virus.rbl.msrbl.net",
+ "web.dnsbl.sorbs.net",
+ "wormrbl.imp.ch",
+ "xbl.spamhaus.org",
+ "zen.spamhaus.org",
+ "zombie.dnsbl.sorbs.net",
+)
+
+class Resolver(tornado.platform.caresresolver.CaresResolver):
+ def initialize(self, **kwargs):
+ super().initialize()
+
+ # Overwrite Channel
+ self.channel = pycares.Channel(sock_state_cb=self._sock_state_cb, **kwargs)
+
+ @tornado.gen.coroutine
+ def query(self, name, type=pycares.QUERY_TYPE_A):
+ # Create a new Future
+ fut = tornado.gen.Future()
+
+ # Perform the query
+ self.channel.query(name, type, lambda result, error: fut.set_result((result, error)))
+
+ # Wait for the response
+ result, error = yield fut
+
+ # Handle any errors
+ if error:
+ # NXDOMAIN
+ if error == pycares.errno.ARES_ENOTFOUND:
+ return
+
+ # Ignore responses with no data
+ elif error == pycares.errno.ARES_ENODATA:
+ return
+
+ raise IOError(
+ "C-Ares returned error %s: %s while resolving %s"
+ % (error, pycares.errno.strerror(error), name)
+ )
+
+ # Return the result
+ return result
+
+