[3.9] bpo-42756: Configure LMTP Unix-domain socket to use global default timeout when timeout not provided (GH-23969) (GH-24050)

This commit is contained in:
Ross 2021-01-02 03:44:04 +00:00 committed by GitHub
parent 0d6e40744a
commit 69120613c0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 22 additions and 1 deletions

View File

@ -1082,7 +1082,8 @@ class LMTP(SMTP):
# Handle Unix-domain sockets. # Handle Unix-domain sockets.
try: try:
self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
self.sock.settimeout(self.timeout) if self.timeout is not socket._GLOBAL_DEFAULT_TIMEOUT:
self.sock.settimeout(self.timeout)
self.file = None self.file = None
self.sock.connect(host) self.sock.connect(host)
except OSError: except OSError:

View File

@ -107,6 +107,9 @@ class MockSocket:
def close(self): def close(self):
pass pass
def connect(self, host):
pass
def socket(family=None, type=None, proto=None): def socket(family=None, type=None, proto=None):
return MockSocket(family) return MockSocket(family)
@ -152,8 +155,12 @@ error = socket_module.error
# Constants # Constants
_GLOBAL_DEFAULT_TIMEOUT = socket_module._GLOBAL_DEFAULT_TIMEOUT
AF_INET = socket_module.AF_INET AF_INET = socket_module.AF_INET
AF_INET6 = socket_module.AF_INET6 AF_INET6 = socket_module.AF_INET6
SOCK_STREAM = socket_module.SOCK_STREAM SOCK_STREAM = socket_module.SOCK_STREAM
SOL_SOCKET = None SOL_SOCKET = None
SO_REUSEADDR = None SO_REUSEADDR = None
if hasattr(socket_module, 'AF_UNIX'):
AF_UNIX = socket_module.AF_UNIX

View File

@ -165,6 +165,17 @@ class LMTPGeneralTests(GeneralTests, unittest.TestCase):
client = smtplib.LMTP client = smtplib.LMTP
@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), "test requires Unix domain socket")
def testUnixDomainSocketTimeoutDefault(self):
local_host = '/some/local/lmtp/delivery/program'
mock_socket.reply_with(b"220 Hello world")
try:
client = self.client(local_host, self.port)
finally:
mock_socket.setdefaulttimeout(None)
self.assertIsNone(client.sock.gettimeout())
client.close()
def testTimeoutZero(self): def testTimeoutZero(self):
super().testTimeoutZero() super().testTimeoutZero()
local_host = '/some/local/lmtp/delivery/program' local_host = '/some/local/lmtp/delivery/program'

View File

@ -0,0 +1,2 @@
Configure LMTP Unix-domain socket to use socket global default timeout when
a timeout is not explicitly provided.