# so restrict to ipv4 by default.
af = socket.AF_INET
+ timeout = min(self.request.connect_timeout, self.request.request_timeout)
+ if timeout:
+ self._timeout = self.io_loop.add_timeout(
+ self.start_time + timeout,
+ stack_context.wrap(self._on_timeout))
self.resolver.resolve(host, port, af, callback=self._on_resolve)
def _on_resolve(self, addrinfo):
+ if self.final_callback is None:
+ # final_callback is cleared if we've hit our timeout
+ return
self.stream = self._create_stream(addrinfo)
- timeout = min(self.request.connect_timeout, self.request.request_timeout)
- if timeout:
- self._timeout = self.io_loop.add_timeout(
- self.start_time + timeout,
- stack_context.wrap(self._on_timeout))
self.stream.set_close_callback(self._on_close)
# ipv6 addresses are broken (in self.parsed.hostname) until
# 2.7, here is correctly parsed value calculated in __init__
def _on_connect(self):
self._remove_timeout()
+ if self.final_callback is None:
+ return
if self.request.request_timeout:
self._timeout = self.io_loop.add_timeout(
self.start_time + self.request.request_timeout,
from tornado.httputil import HTTPHeaders
from tornado.ioloop import IOLoop
from tornado.log import gen_log
+from tornado.netutil import Resolver
from tornado.simple_httpclient import SimpleAsyncHTTPClient, _DEFAULT_CA_CERTS
from tornado.test.httpclient_test import ChunkHandler, CountdownHandler, HelloWorldHandler
from tornado.test import httpclient_test
response = self.wait()
response.rethrow()
self.assertEqual(response.body, b'Hello world!')
+
+
+class ResolveTimeoutTestCase(AsyncHTTPTestCase):
+ def setUp(self):
+ # Dummy Resolver subclass that never invokes its callback.
+ class BadResolver(Resolver):
+ def resolve(self, *args, **kwargs):
+ pass
+
+ super(ResolveTimeoutTestCase, self).setUp()
+ self.http_client = SimpleAsyncHTTPClient(
+ self.io_loop,
+ resolver=BadResolver())
+
+ def get_app(self):
+ return Application([url("/hello", HelloWorldHandler), ])
+
+ def test_resolve_timeout(self):
+ response = self.fetch('/hello', connect_timeout=0.1)
+ self.assertEqual(response.code, 599)