Skip to content

Commit af28d14

Browse files
juangjAutomatedTester
authored andcommitted
Return IPv6 address in resolve_ip, if both v4 and v6 are available, but only v6 is connectable.
1 parent 8f1721d commit af28d14

File tree

2 files changed

+14
-4
lines changed

2 files changed

+14
-4
lines changed

py/selenium/webdriver/common/utils.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,19 @@ def free_port():
3939
free_socket.close()
4040
return port
4141

42-
def resolve_ip(host):
42+
def find_connectable_ip(host, port=None):
4343
"""Resolve a hostname to an IP, preferring IPv4 addresses.
4444
4545
We prefer IPv4 so that we don't change behavior from previous IPv4-only
4646
implementations, and because some drivers (e.g., FirefoxDriver) do not
4747
support IPv6 connections.
4848
49+
If the optional port number is provided, only IPs that listen on the given
50+
port are considered.
51+
4952
:Args:
5053
- host - A hostname.
54+
- port - Optional port number.
5155
5256
:Returns:
5357
A single IP address, as a string. If any IPv4 address is found, one is
@@ -62,9 +66,13 @@ def resolve_ip(host):
6266

6367
ip = None
6468
for family, _, _, _, sockaddr in addrinfos:
65-
if family == socket.AF_INET:
69+
connectable = True
70+
if port:
71+
connectable = is_connectable(port, sockaddr[0])
72+
73+
if connectable and family == socket.AF_INET:
6674
return sockaddr[0]
67-
if not ip and family == socket.AF_INET6:
75+
if connectable and not ip and family == socket.AF_INET6:
6876
ip = sockaddr[0]
6977
return ip
7078

py/selenium/webdriver/remote/remote_connection.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,9 @@ def __init__(self, remote_server_addr, keep_alive=False, resolve_ip=True):
168168
parsed_url = parse.urlparse(remote_server_addr)
169169
addr = ""
170170
if parsed_url.hostname and resolve_ip:
171-
ip = common_utils.resolve_ip(parsed_url.hostname)
171+
port = parsed_url.port or None
172+
ip = common_utils.find_connectable_ip(parsed_url.hostname,
173+
port=port)
172174
if ip:
173175
netloc = ip
174176
addr = netloc

0 commit comments

Comments
 (0)