]> git.ipfire.org Git - thirdparty/tornado.git/commitdiff
Add a resolver test script for external queries that cannot be unittested.
authorBen Darnell <ben@bendarnell.com>
Sun, 24 Feb 2013 17:43:06 +0000 (12:43 -0500)
committerBen Darnell <ben@bendarnell.com>
Sun, 24 Feb 2013 17:56:09 +0000 (12:56 -0500)
Note an issue with CaresResolver (it cannot resolve www.dropbox.com when
family==AF_UNSPEC)

maint/requirements.txt
maint/scripts/test_resolvers.py [new file with mode: 0644]
tornado/platform/caresresolver.py
tornado/platform/twisted.py

index a8875bf783510fa13ccdfa2294e0e996cb80394d..c418160191471c73e122a90d2fd5737de78536f2 100644 (file)
@@ -4,6 +4,7 @@
 Twisted==12.2.0
 futures==2.1.3
 mock==1.0.1
+pycares==0.4.0
 pycurl==7.19.0
 
 # Other useful tools
diff --git a/maint/scripts/test_resolvers.py b/maint/scripts/test_resolvers.py
new file mode 100644 (file)
index 0000000..6cfe15d
--- /dev/null
@@ -0,0 +1,60 @@
+#!/usr/bin/env python
+from __future__ import print_function
+
+import pprint
+import socket
+
+from tornado import gen
+from tornado.ioloop import IOLoop
+from tornado.netutil import Resolver, ThreadedResolver
+from tornado.options import parse_command_line, define, options
+
+try:
+    import twisted
+except ImportError:
+    twisted = None
+
+try:
+    import pycares
+except ImportError:
+    pycares = None
+
+define('family', default='unspec',
+       help='Address family to query: unspec, inet, or inet6')
+
+@gen.engine
+def main():
+    args = parse_command_line()
+
+    if not args:
+        args = ['localhost', 'www.google.com',
+                'www.facebook.com', 'www.dropbox.com']
+
+    resolvers = [Resolver(), ThreadedResolver()]
+
+    if twisted is not None:
+        from tornado.platform.twisted import TwistedResolver
+        resolvers.append(TwistedResolver())
+
+    if pycares is not None:
+        from tornado.platform.caresresolver import CaresResolver
+        resolvers.append(CaresResolver())
+
+    family = {
+        'unspec': socket.AF_UNSPEC,
+        'inet': socket.AF_INET,
+        'inet6': socket.AF_INET6,
+        }[options.family]
+
+    for host in args:
+        print('Resolving %s' % host)
+        for resolver in resolvers:
+            addrinfo = yield resolver.getaddrinfo(host, 80, family)
+            print('%s: %s' % (resolver.__class__.__name__,
+                              pprint.pformat(addrinfo)))
+        print()
+    IOLoop.instance().stop()
+
+if __name__ == '__main__':
+    IOLoop.instance().add_callback(main)
+    IOLoop.instance().start()
index 11dafd4a27aecfdeafde200c186c46840f244c7c..fe8cc377c4f723198e5bcb0b9787c5e2b0427db3 100644 (file)
@@ -12,6 +12,11 @@ class CaresResolver(Resolver):
     This is a non-blocking and non-threaded resolver.  It may not produce
     the same results as the system resolver, but can be used for non-blocking
     resolution when threads cannot be used.
+
+    c-ares fails to resolve some names when ``family`` is ``AF_UNSPEC``,
+    so it is only recommended for use in ``AF_INET`` (i.e. IPv4).  This is
+    the default for `tornado.simple_httpclient`, but other libraries
+    may default to ``AF_UNSPEC``.
     """
     def initialize(self, io_loop=None):
         self.io_loop = io_loop or IOLoop.instance()
index f5b042da1741e3193cafb346cbd850e6c4751de5..419b98832b7ee36739a8674ac2c08af4384f5b1f 100644 (file)
@@ -500,8 +500,8 @@ class TwistedResolver(Resolver):
     are ignored.  It may fail to resolve when ``family`` is not
     ``socket.AF_UNSPEC``.
     """
-    def initialize(self, io_loop):
-        self.io_loop = io_loop
+    def initialize(self, io_loop=None):
+        self.io_loop = io_loop or IOLoop.instance()
         # partial copy of twisted.names.client.createResolver, which doesn't
         # allow for a reactor to be passed in.
         self.reactor = tornado.platform.twisted.TornadoReactor(io_loop)