Skip to content

Commit bc88096

Browse files
authored
[py] Allow free_port() to bind to IPv6 if IPv4 is unavailable (#16003)
1 parent 21e3af9 commit bc88096

File tree

1 file changed

+24
-6
lines changed

1 file changed

+24
-6
lines changed

py/selenium/webdriver/common/utils.py

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,30 @@
2727

2828

2929
def free_port() -> int:
30-
"""Determines a free port using sockets."""
31-
free_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
32-
free_socket.bind(("127.0.0.1", 0))
33-
free_socket.listen(5)
34-
port: int = free_socket.getsockname()[1]
35-
free_socket.close()
30+
"""Determines a free port using sockets.
31+
32+
First try IPv4, but use IPv6 if it can't bind (IPv6-only system).
33+
"""
34+
free_socket = None
35+
try:
36+
# IPv4
37+
free_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
38+
free_socket.bind(("127.0.0.1", 0))
39+
except OSError:
40+
if free_socket:
41+
free_socket.close()
42+
# IPv6
43+
try:
44+
free_socket = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
45+
free_socket.bind(("::1", 0))
46+
except OSError:
47+
raise RuntimeError("Can't find free port (Unable to bind to IPv4 or IPv6)")
48+
try:
49+
port: int = free_socket.getsockname()[1]
50+
except Exception as e:
51+
raise RuntimeError(f"Can't find free port: ({e})")
52+
finally:
53+
free_socket.close()
3654
return port
3755

3856

0 commit comments

Comments
 (0)