]> git.ipfire.org Git - thirdparty/tornado.git/commitdiff
Allow ipv6 in simple_httpclient by default.
authorBen Darnell <ben@bendarnell.com>
Sun, 4 May 2014 23:05:07 +0000 (19:05 -0400)
committerBen Darnell <ben@bendarnell.com>
Sun, 18 May 2014 15:11:09 +0000 (11:11 -0400)
Improve connection error handling (especially for SelectIOLoop).

tornado/iostream.py
tornado/simple_httpclient.py
tornado/test/simple_httpclient_test.py
tornado/test/tcpclient_test.py

index c29494e2ebeb3667cf8e2a26e903f30d6d6a5510..e6885b6a7789d4c41e7593b4dd1dc66cb9c7c803 100644 (file)
@@ -970,8 +970,9 @@ class IOStream(BaseIOStream):
             # an error state before the socket becomes writable, so
             # in that case a connection failure would be handled by the
             # error path in _handle_events instead of here.
-            gen_log.warning("Connect error on fd %s: %s",
-                            self.socket.fileno(), errno.errorcode[err])
+            if self._connect_future is None:
+                gen_log.warning("Connect error on fd %s: %s",
+                                self.socket.fileno(), errno.errorcode[err])
             self.close()
             return
         if self._connect_callback is not None:
@@ -1132,6 +1133,10 @@ class SSLIOStream(IOStream):
         return super(SSLIOStream, self).connect(address, callback=None)
 
     def _handle_connect(self):
+        # Call the superclass method to check for errors.
+        super(SSLIOStream, self)._handle_connect()
+        if self.closed():
+            return
         # When the connection is complete, wrap the socket for SSL
         # traffic.  Note that we do this by overriding _handle_connect
         # instead of by passing a callback to super().connect because
@@ -1149,7 +1154,6 @@ class SSLIOStream(IOStream):
                                       server_hostname=self._server_hostname,
                                       do_handshake_on_connect=False)
         self._add_io_state(old_state)
-        super(SSLIOStream, self)._handle_connect()
 
     def read_from_fd(self):
         if self._ssl_accepting:
index 06d2ca80168e22253952cf5537fe45f01638b2e6..2d90b0470c53cfe4564e7efa549d9b1d18c7c260 100644 (file)
@@ -206,12 +206,10 @@ class _HTTPConnection(httputil.HTTPMessageDelegate):
                 host = host[1:-1]
             self.parsed_hostname = host  # save final host for _on_connect
 
-            if request.allow_ipv6:
-                af = socket.AF_UNSPEC
-            else:
-                # We only try the first IP we get from getaddrinfo,
-                # so restrict to ipv4 by default.
+            if request.allow_ipv6 is False:
                 af = socket.AF_INET
+            else:
+                af = socket.AF_UNSPEC
 
             ssl_options = self._get_ssl_options(self.parsed.scheme)
 
index e8349ed7e424839b132dbbc2ba7ee9142804062c..e1a1b420528aba035afa08a18ede5536a493426c 100644 (file)
@@ -254,12 +254,12 @@ class SimpleHTTPClientTestMixin(object):
             raise
         url = self.get_url("/hello").replace("localhost", "[::1]")
 
-        # ipv6 is currently disabled by default and must be explicitly requested
-        self.http_client.fetch(url, self.stop)
+        # ipv6 is currently enabled by default but can be disabled
+        self.http_client.fetch(url, self.stop, allow_ipv6=False)
         response = self.wait()
         self.assertEqual(response.code, 599)
 
-        self.http_client.fetch(url, self.stop, allow_ipv6=True)
+        self.http_client.fetch(url, self.stop)
         response = self.wait()
         self.assertEqual(response.body, b"Hello world!")
 
index 7a9882e85b3a716463cc5423feb6f8dceb73595c..48099c66b74896aab546242acce935f4086781da 100644 (file)
@@ -20,11 +20,10 @@ from contextlib import closing
 import socket
 
 from tornado.concurrent import Future
-from tornado.log import gen_log
 from tornado.netutil import bind_sockets, Resolver
 from tornado.tcpclient import TCPClient, _Connector
 from tornado.tcpserver import TCPServer
-from tornado.testing import AsyncTestCase, bind_unused_port, gen_test, ExpectLog
+from tornado.testing import AsyncTestCase, bind_unused_port, gen_test
 from tornado.test.util import skipIfNoIPv6, unittest
 
 # Fake address families for testing.  Used in place of AF_INET
@@ -80,8 +79,7 @@ class TCPClientTest(AsyncTestCase):
         self.do_test_connect(socket.AF_INET, '127.0.0.1')
 
     def test_connect_ipv4_dual(self):
-        with ExpectLog(gen_log, 'Connect error', required=False):
-            self.do_test_connect(socket.AF_INET, 'localhost')
+        self.do_test_connect(socket.AF_INET, 'localhost')
 
     @skipIfNoIPv6
     def test_connect_ipv6_ipv6(self):
@@ -91,8 +89,7 @@ class TCPClientTest(AsyncTestCase):
     def test_connect_ipv6_dual(self):
         if Resolver.configured_class().__name__.endswith('TwistedResolver'):
             self.skipTest('TwistedResolver does not support multiple addresses')
-        with ExpectLog(gen_log, 'Connect error', required=False):
-            self.do_test_connect(socket.AF_INET6, 'localhost')
+        self.do_test_connect(socket.AF_INET6, 'localhost')
 
     def test_connect_unspec_ipv4(self):
         self.do_test_connect(socket.AF_UNSPEC, '127.0.0.1')
@@ -108,9 +105,8 @@ class TCPClientTest(AsyncTestCase):
     def test_refused_ipv4(self):
         sock, port = bind_unused_port()
         sock.close()
-        with ExpectLog(gen_log, 'Connect error'):
-            with self.assertRaises(IOError):
-                yield self.client.connect('127.0.0.1', port)
+        with self.assertRaises(IOError):
+            yield self.client.connect('127.0.0.1', port)
 
 
 class TestConnectorSplit(unittest.TestCase):