]> git.ipfire.org Git - thirdparty/tornado.git/commitdiff
Error handling in TwistedResolver 965/head
authorA. Jesse Jiryu Davis <jesse@10gen.com>
Tue, 24 Dec 2013 21:02:07 +0000 (15:02 -0600)
committerA. Jesse Jiryu Davis <jesse@10gen.com>
Tue, 24 Dec 2013 21:02:07 +0000 (15:02 -0600)
tornado/platform/twisted.py
tornado/test/netutil_test.py

index c0ee595790a0a09118eb2c7d1478b0242d29bee5..86ef71b903f61d591c6889ac27113edb19da05d2 100644 (file)
@@ -527,8 +527,10 @@ class TwistedResolver(Resolver):
             resolved_family = socket.AF_INET6
         else:
             deferred = self.resolver.getHostByName(utf8(host))
-            resolved = yield gen.Task(deferred.addCallback)
-            if twisted.internet.abstract.isIPAddress(resolved):
+            resolved = yield gen.Task(deferred.addBoth)
+            if isinstance(resolved, failure.Failure):
+                resolved.raiseException()
+            elif twisted.internet.abstract.isIPAddress(resolved):
                 resolved_family = socket.AF_INET
             elif twisted.internet.abstract.isIPv6Address(resolved):
                 resolved_family = socket.AF_INET6
index d99e524c265d7b6919d9e513f34861eec2548ce9..777fb4257fe0b531142c6479abf07c7ba0069ab0 100644 (file)
@@ -7,6 +7,7 @@ import sys
 import time
 
 from tornado.netutil import BlockingResolver, ThreadedResolver, is_valid_ip
+from tornado.stack_context import ExceptionStackContext
 from tornado.testing import AsyncTestCase, gen_test
 from tornado.test.util import unittest
 
@@ -43,6 +44,23 @@ class _ResolverTestMixin(object):
         self.assertIn((socket.AF_INET, ('127.0.0.1', 80)),
                       addrinfo)
 
+    def test_bad_host(self):
+        def handler(exc_typ, exc_val, exc_tb):
+            self.stop(exc_val)
+            return True  # Halt propagation.
+
+        with ExceptionStackContext(handler):
+            self.resolver.resolve('doesntexist', 80, callback=self.stop)
+
+        result = self.wait()
+        self.assertIsInstance(result, Exception)
+
+    @gen_test
+    def test_future_interface_bad_host(self):
+        with self.assertRaises(Exception):
+            yield self.resolver.resolve('doesntexist', 80,
+                                        socket.AF_UNSPEC)
+
 
 class BlockingResolverTest(AsyncTestCase, _ResolverTestMixin):
     def setUp(self):