This can be used to make local DNS changes (e.g. for testing)
without modifying system-wide settings.
- The mapping can contain either host strings or host-port pairs.
+ The mapping can contain either host strings or host-port pairs or
+ host-port-family triplets.
"""
def initialize(self, resolver, mapping):
self.resolver = resolver
def close(self):
self.resolver.close()
- def resolve(self, host, port, *args, **kwargs):
- if (host, port) in self.mapping:
+ def resolve(self, host, port, family=socket.AF_UNSPEC, *args, **kwargs):
+ if (host, port, family) in self.mapping:
+ host, port = self.mapping[(host, port, family)]
+ elif (host, port) in self.mapping:
host, port = self.mapping[(host, port)]
elif host in self.mapping:
host = self.mapping[host]
- return self.resolver.resolve(host, port, *args, **kwargs)
+ return self.resolver.resolve(host, port, family, *args, **kwargs)
# These are the keyword arguments to ssl.wrap_socket that must be translated
import sys
import time
-from tornado.netutil import BlockingResolver, ThreadedResolver, is_valid_ip, bind_sockets
+from tornado.netutil import BlockingResolver, OverrideResolver, ThreadedResolver, is_valid_ip, bind_sockets
from tornado.stack_context import ExceptionStackContext
from tornado.testing import AsyncTestCase, gen_test, bind_unused_port
from tornado.test.util import unittest, skipIfNoNetwork
super(BlockingResolverErrorTest, self).tearDown()
+class OverrideResolverTest(AsyncTestCase, _ResolverTestMixin):
+ def setUp(self):
+ super(OverrideResolverTest, self).setUp()
+ mapping = {
+ ('google.com', 80): ('1.2.3.4', 80),
+ ('google.com', 80, socket.AF_INET): ('1.2.3.4', 80),
+ ('google.com', 80, socket.AF_INET6): ('2a02:6b8:7c:40c:c51e:495f:e23a:3', 80)
+ }
+ self.resolver = OverrideResolver(BlockingResolver(), mapping)
+
+ def test_resolve_multiaddr(self):
+ self.resolver.resolve('google.com', 80, socket.AF_INET, callback=self.stop)
+ result = self.wait()
+ self.assertIn((socket.AF_INET, ('1.2.3.4', 80)), result)
+
+ self.resolver.resolve('google.com', 80, socket.AF_INET6, callback=self.stop)
+ result = self.wait()
+ self.assertIn((socket.AF_INET6, ('2a02:6b8:7c:40c:c51e:495f:e23a:3', 80, 0, 0)), result)
+
+
@skipIfNoNetwork
@unittest.skipIf(futures is None, "futures module not present")
class ThreadedResolverTest(AsyncTestCase, _ResolverTestMixin):