Skip to content

Commit 1686f09

Browse files
committed
Try all getaddrinfo results when connecting to a server - see #215
1 parent 6897d88 commit 1686f09

File tree

1 file changed

+21
-8
lines changed

1 file changed

+21
-8
lines changed

emailproxy.py

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
__author__ = 'Simon Robinson'
77
__copyright__ = 'Copyright (c) 2024 Simon Robinson'
88
__license__ = 'Apache 2.0'
9-
__version__ = '2024-03-13' # ISO 8601 (YYYY-MM-DD)
9+
__version__ = '2024-03-14' # ISO 8601 (YYYY-MM-DD)
1010
__package_version__ = '.'.join([str(int(i)) for i in __version__.split('-')]) # for pyproject.toml usage only
1111

1212
import abc
@@ -1755,14 +1755,27 @@ def __init__(self, proxy_type, connection_socket, socket_map, proxy_parent, cust
17551755
self.authenticated_username = None # used only for showing last activity in the menu
17561756
self.last_activity = 0
17571757

1758-
self.create_socket()
1759-
self.connect(self.server_address)
1758+
self.create_connection()
17601759

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')
17661779

17671780
def info_string(self):
17681781
debug_string = self.debug_address_string if Log.get_level() == logging.DEBUG else \

0 commit comments

Comments
 (0)