From 465e15f354020e994747dad6a61dfb177f50369c Mon Sep 17 00:00:00 2001 From: "A. Jesse Jiryu Davis" Date: Tue, 24 Dec 2013 15:02:07 -0600 Subject: [PATCH] Error handling in TwistedResolver --- tornado/platform/twisted.py | 6 ++++-- tornado/test/netutil_test.py | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/tornado/platform/twisted.py b/tornado/platform/twisted.py index c0ee59579..86ef71b90 100644 --- a/tornado/platform/twisted.py +++ b/tornado/platform/twisted.py @@ -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 diff --git a/tornado/test/netutil_test.py b/tornado/test/netutil_test.py index d99e524c2..777fb4257 100644 --- a/tornado/test/netutil_test.py +++ b/tornado/test/netutil_test.py @@ -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): -- 2.47.2