Explorar o código

Handle missing IPv6 support by the kernel

This is different from disabled IPv6.

Fixes #1050
Unrud %!s(int64=5) %!d(string=hai) anos
pai
achega
6ec63ccc9b
Modificáronse 2 ficheiros con 15 adicións e 11 borrados
  1. 3 1
      radicale/server.py
  2. 12 10
      radicale/tests/test_server.py

+ 3 - 1
radicale/server.py

@@ -238,7 +238,9 @@ def serve(configuration, shutdown_socket):
                             # Address family not available (e.g. IPv6 disabled)
                             # macOS: IPv4 address for INET6 address family with
                             #        IPV6_V6ONLY set
-                            e.errno == errno.EADDRNOTAVAIL)):
+                            e.errno == errno.EADDRNOTAVAIL or
+                            # Address family not supported
+                            e.errno == errno.EAFNOSUPPORT)):
                         continue
                     raise RuntimeError("Failed to start server %r: %s" % (
                                            format_address(address), e)) from e

+ 12 - 10
radicale/tests/test_server.py

@@ -132,20 +132,22 @@ class TestBaseServerRequests(BaseTest):
                         socket.EAI_NONAME, server.COMPAT_EAI_ADDRFAMILY,
                         server.COMPAT_EAI_NODATA) or
                     str(exc_info.value) == "address family mismatched" or
-                    exc_info.value.errno == errno.EADDRNOTAVAIL)
+                    exc_info.value.errno == errno.EADDRNOTAVAIL or
+                    exc_info.value.errno == errno.EAFNOSUPPORT)
 
     def test_ipv6(self):
-        with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as sock:
-            # Only allow IPv6 connections to the IPv6 socket
-            sock.setsockopt(server.COMPAT_IPPROTO_IPV6, socket.IPV6_V6ONLY, 1)
-            try:
+        try:
+            with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as sock:
+                # Only allow IPv6 connections to the IPv6 socket
+                sock.setsockopt(
+                    server.COMPAT_IPPROTO_IPV6, socket.IPV6_V6ONLY, 1)
                 # Find available port
                 sock.bind(("::1", 0))
-            except OSError as e:
-                if e.errno == errno.EADDRNOTAVAIL:
-                    pytest.skip("IPv6 not supported")
-                raise
-            self.sockname = sock.getsockname()[:2]
+                self.sockname = sock.getsockname()[:2]
+        except OSError as e:
+            if e.errno in (errno.EADDRNOTAVAIL, errno.EAFNOSUPPORT):
+                pytest.skip("IPv6 not supported")
+            raise
         self.configuration.update({
             "server": {"hosts": "[%s]:%d" % self.sockname}}, "test")
         self.thread.start()