Nicolas Duchon 5 mesi fa
parent
commit
250c808353
1 ha cambiato i file con 23 aggiunte e 1 eliminazioni
  1. 23 1
      test/conftest.py

+ 23 - 1
test/conftest.py

@@ -26,7 +26,6 @@ logging.getLogger('requests.packages.urllib3.connectionpool').setLevel(logging.W
 
 CA_ROOT_CERTIFICATE = os.path.join(os.path.dirname(__file__), 'certs/ca-root.crt')
 PYTEST_RUNNING_IN_CONTAINER = os.environ.get('PYTEST_RUNNING_IN_CONTAINER') == "1"
-HAS_IPV6 = socket.has_ipv6
 FORCE_CONTAINER_IPV6 = False  # ugly global state to consider containers' IPv6 address instead of IPv4
 
 DOCKER_COMPOSE = os.environ.get('DOCKER_COMPOSE', 'docker compose')
@@ -43,6 +42,29 @@ test_container = 'nginx-proxy-pytest'
 #
 ###############################################################################
 
+def _has_ipv6(host: str) -> bool:
+    """Returns True if the system can bind an IPv6 address."""
+    sock = None
+    has_ipv6 = False
+
+    if socket.has_ipv6:
+        # has_ipv6 returns true if cPython was compiled with IPv6 support.
+        # It does not tell us if the system has IPv6 support enabled. To
+        # determine that we must bind to an IPv6 address.
+        # https://github.com/urllib3/urllib3/pull/611
+        # https://bugs.python.org/issue658327
+        try:
+            sock = socket.socket(socket.AF_INET6)
+            sock.bind((host, 0))
+            has_ipv6 = True
+        except Exception:
+            pass
+
+    if sock:
+        sock.close()
+    return has_ipv6
+
+HAS_IPV6 = _has_ipv6("::1")
 
 @contextlib.contextmanager
 def ipv6(force_ipv6=True):