chore: import upstream snapshot with attribution
This commit is contained in:
@@ -0,0 +1,123 @@
|
||||
from ray.includes.network_util cimport (
|
||||
BuildAddress,
|
||||
ParseAddress,
|
||||
GetNodeIpAddressFromPerspective,
|
||||
IsIPv6,
|
||||
GetLocalhostIP,
|
||||
GetAllInterfacesIP,
|
||||
IsLocalhost,
|
||||
array_string_2,
|
||||
optional,
|
||||
)
|
||||
from libcpp.string cimport string
|
||||
from typing import Optional, Tuple, Union
|
||||
|
||||
|
||||
def parse_address(address: str) -> Optional[Tuple[str, str]]:
|
||||
"""Parse a network address string into host and port.
|
||||
|
||||
Args:
|
||||
address: The address string to parse (e.g., "localhost:8000", "[::1]:8000").
|
||||
|
||||
Returns:
|
||||
Tuple with (host, port) if port found, None if no colon separator.
|
||||
"""
|
||||
cdef optional[array_string_2] res = ParseAddress(address.encode('utf-8'))
|
||||
if not res.has_value():
|
||||
return None
|
||||
|
||||
cdef array_string_2 ip_port = res.value()
|
||||
return (ip_port[0].decode('utf-8'), ip_port[1].decode('utf-8'))
|
||||
|
||||
|
||||
def build_address(host: str, port: Union[int, str]) -> str:
|
||||
"""Build a network address string from host and port.
|
||||
|
||||
Args:
|
||||
host: The hostname or IP address.
|
||||
port: The port number (int or string).
|
||||
|
||||
Returns:
|
||||
Formatted address string (e.g., "localhost:8000" or "[::1]:8000").
|
||||
"""
|
||||
cdef string host_c = host.encode('utf-8')
|
||||
cdef string result
|
||||
cdef string port_c
|
||||
|
||||
if isinstance(port, int):
|
||||
result = BuildAddress(host_c, <int>port)
|
||||
else:
|
||||
port_c = str(port).encode('utf-8')
|
||||
result = BuildAddress(host_c, port_c)
|
||||
|
||||
return result.decode('utf-8')
|
||||
|
||||
|
||||
def node_ip_address_from_perspective(address=None) -> str:
|
||||
"""IP address by which the local node can be reached from the address.
|
||||
|
||||
If no address is given, defaults to public DNS servers for detection.
|
||||
|
||||
Args:
|
||||
address: The IP address and port of any known live service on the
|
||||
network you care about.
|
||||
|
||||
Returns:
|
||||
The IP address by which the local node can be reached from the address.
|
||||
"""
|
||||
cdef string node_ip
|
||||
cdef optional[string] address_c
|
||||
cdef string address_str
|
||||
if address is not None:
|
||||
address_str = address.encode('utf-8')
|
||||
address_c = optional[string](address_str)
|
||||
else:
|
||||
address_c = optional[string]()
|
||||
node_ip = GetNodeIpAddressFromPerspective(address_c)
|
||||
return node_ip.decode('utf-8')
|
||||
|
||||
|
||||
def is_ipv6(host: str) -> bool:
|
||||
"""Check if a host is resolved to IPv6.
|
||||
|
||||
Args:
|
||||
host: The IP or domain name to check (must be without port).
|
||||
|
||||
Returns:
|
||||
True if the host is resolved to IPv6, False if IPv4.
|
||||
"""
|
||||
cdef string host_c = host.encode('utf-8')
|
||||
return IsIPv6(host_c)
|
||||
|
||||
|
||||
def get_localhost_ip() -> str:
|
||||
"""Get localhost loopback IP with IPv4/IPv6 support.
|
||||
|
||||
Returns:
|
||||
"127.0.0.1" for IPv4 or "::1" for IPv6.
|
||||
"""
|
||||
cdef string result = GetLocalhostIP()
|
||||
return result.decode('utf-8')
|
||||
|
||||
|
||||
def get_all_interfaces_ip() -> str:
|
||||
"""Get the IP address to bind to all network interfaces.
|
||||
|
||||
Returns "0.0.0.0" for IPv4 or "::" for IPv6, depending on the system's
|
||||
localhost resolution.
|
||||
"""
|
||||
cdef string result = GetAllInterfacesIP()
|
||||
return result.decode('utf-8')
|
||||
|
||||
|
||||
def is_localhost(host: str) -> bool:
|
||||
"""Check if the given host string represents a localhost address.
|
||||
|
||||
Args:
|
||||
host: The hostname or IP address to check.
|
||||
|
||||
Returns:
|
||||
True if the host is a localhost address (127.0.0.1, ::1, or "localhost").
|
||||
"""
|
||||
cdef string host_c = host.encode('utf-8')
|
||||
return IsLocalhost(host_c)
|
||||
Reference in New Issue
Block a user