|
6 | 6 | __author__ = 'Simon Robinson' |
7 | 7 | __copyright__ = 'Copyright (c) 2024 Simon Robinson' |
8 | 8 | __license__ = 'Apache 2.0' |
9 | | -__version__ = '2024-03-13' # ISO 8601 (YYYY-MM-DD) |
| 9 | +__version__ = '2024-03-14' # ISO 8601 (YYYY-MM-DD) |
10 | 10 | __package_version__ = '.'.join([str(int(i)) for i in __version__.split('-')]) # for pyproject.toml usage only |
11 | 11 |
|
12 | 12 | import abc |
@@ -1755,14 +1755,27 @@ def __init__(self, proxy_type, connection_socket, socket_map, proxy_parent, cust |
1755 | 1755 | self.authenticated_username = None # used only for showing last activity in the menu |
1756 | 1756 | self.last_activity = 0 |
1757 | 1757 |
|
1758 | | - self.create_socket() |
1759 | | - self.connect(self.server_address) |
| 1758 | + self.create_connection() |
1760 | 1759 |
|
1761 | | - def create_socket(self, socket_family=socket.AF_UNSPEC, socket_type=socket.SOCK_STREAM): |
1762 | | - # connect to whichever resolved IPv4 or IPv6 address is returned first by the system |
1763 | | - for a in socket.getaddrinfo(self.server_address[0], self.server_address[1], socket_family, socket.SOCK_STREAM): |
1764 | | - super().create_socket(a[0], socket.SOCK_STREAM) |
1765 | | - return |
| 1760 | + def create_connection(self): |
| 1761 | + # resolve the given address, then create a socket and connect to each result in turn until one succeeds |
| 1762 | + # noinspection PyTypeChecker |
| 1763 | + for result in socket.getaddrinfo(*self.server_address, socket.AF_UNSPEC, socket.SOCK_STREAM): |
| 1764 | + family, socket_type, _protocol, _canonical_name, socket_address = result |
| 1765 | + try: |
| 1766 | + self.create_socket(family, socket_type) |
| 1767 | + self.connect(socket_address) |
| 1768 | + return |
| 1769 | + |
| 1770 | + except OSError as e: |
| 1771 | + self.del_channel() |
| 1772 | + if self.socket is not None: |
| 1773 | + self.socket.close() |
| 1774 | + socket_type = ' IPv4' if family == socket.AF_INET else ' IPv6' if family == socket.AF_INET6 else '' |
| 1775 | + Log.debug(self.info_string(), 'Unable to create%s socket' % socket_type, 'from getaddrinfo result', |
| 1776 | + result, '-', Log.error_string(e)) |
| 1777 | + |
| 1778 | + raise socket.gaierror(8, 'All socket creation attempts failed - unable to resolve host') |
1766 | 1779 |
|
1767 | 1780 | def info_string(self): |
1768 | 1781 | debug_string = self.debug_address_string if Log.get_level() == logging.DEBUG else \ |
|
0 commit comments