bpo-39259: poplib now rejects timeout = 0 (GH-17912)
poplib.POP3 and poplib.POP3_SSL now raise a ValueError if the given timeout for their constructor is zero to prevent the creation of a non-blocking socket.
This commit is contained in:
parent
4c53e63cc9
commit
c39b52f152
|
@ -47,6 +47,9 @@ The :mod:`poplib` module provides two classes:
|
||||||
``poplib.putline`` with arguments ``self`` and ``line``,
|
``poplib.putline`` with arguments ``self`` and ``line``,
|
||||||
where ``line`` is the bytes about to be sent to the remote host.
|
where ``line`` is the bytes about to be sent to the remote host.
|
||||||
|
|
||||||
|
.. versionchanged:: 3.9
|
||||||
|
If the *timeout* parameter is set to be zero, it will raise a
|
||||||
|
:class:`ValueError` to prevent the creation of a non-blocking socket.
|
||||||
|
|
||||||
.. class:: POP3_SSL(host, port=POP3_SSL_PORT, keyfile=None, certfile=None, timeout=None, context=None)
|
.. class:: POP3_SSL(host, port=POP3_SSL_PORT, keyfile=None, certfile=None, timeout=None, context=None)
|
||||||
|
|
||||||
|
@ -85,6 +88,10 @@ The :mod:`poplib` module provides two classes:
|
||||||
:func:`ssl.create_default_context` select the system's trusted CA
|
:func:`ssl.create_default_context` select the system's trusted CA
|
||||||
certificates for you.
|
certificates for you.
|
||||||
|
|
||||||
|
.. versionchanged:: 3.9
|
||||||
|
If the *timeout* parameter is set to be zero, it will raise a
|
||||||
|
:class:`ValueError` to prevent the creation of a non-blocking socket.
|
||||||
|
|
||||||
One exception is defined as an attribute of the :mod:`poplib` module:
|
One exception is defined as an attribute of the :mod:`poplib` module:
|
||||||
|
|
||||||
|
|
||||||
|
@ -268,4 +275,3 @@ retrieves and prints all messages::
|
||||||
|
|
||||||
At the end of the module, there is a test section that contains a more extensive
|
At the end of the module, there is a test section that contains a more extensive
|
||||||
example of usage.
|
example of usage.
|
||||||
|
|
||||||
|
|
|
@ -187,6 +187,13 @@ Exposed the Linux-specific :func:`os.pidfd_open` (:issue:`38692`) and
|
||||||
:data:`os.P_PIDFD` (:issue:`38713`) for process management with file
|
:data:`os.P_PIDFD` (:issue:`38713`) for process management with file
|
||||||
descriptors.
|
descriptors.
|
||||||
|
|
||||||
|
poplib
|
||||||
|
------
|
||||||
|
|
||||||
|
:class:`~poplib.POP3` and :class:`~poplib.POP3_SSL` now raise a :class:`ValueError`
|
||||||
|
if the given timeout for their constructor is zero to prevent the creation of
|
||||||
|
a non-blocking socket. (Contributed by Dong-hee Na in :issue:`39259`.)
|
||||||
|
|
||||||
threading
|
threading
|
||||||
---------
|
---------
|
||||||
|
|
||||||
|
|
|
@ -107,6 +107,8 @@ class POP3:
|
||||||
self.welcome = self._getresp()
|
self.welcome = self._getresp()
|
||||||
|
|
||||||
def _create_socket(self, timeout):
|
def _create_socket(self, timeout):
|
||||||
|
if timeout is not None and not timeout:
|
||||||
|
raise ValueError('Non-blocking socket (timeout=0) is not supported')
|
||||||
return socket.create_connection((self.host, self.port), timeout)
|
return socket.create_connection((self.host, self.port), timeout)
|
||||||
|
|
||||||
def _putline(self, line):
|
def _putline(self, line):
|
||||||
|
|
|
@ -481,7 +481,7 @@ class TestTimeouts(TestCase):
|
||||||
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||||
self.sock.settimeout(60) # Safety net. Look issue 11812
|
self.sock.settimeout(60) # Safety net. Look issue 11812
|
||||||
self.port = test_support.bind_port(self.sock)
|
self.port = test_support.bind_port(self.sock)
|
||||||
self.thread = threading.Thread(target=self.server, args=(self.evt,self.sock))
|
self.thread = threading.Thread(target=self.server, args=(self.evt, self.sock))
|
||||||
self.thread.daemon = True
|
self.thread.daemon = True
|
||||||
self.thread.start()
|
self.thread.start()
|
||||||
self.evt.wait()
|
self.evt.wait()
|
||||||
|
@ -505,12 +505,12 @@ class TestTimeouts(TestCase):
|
||||||
|
|
||||||
def testTimeoutDefault(self):
|
def testTimeoutDefault(self):
|
||||||
self.assertIsNone(socket.getdefaulttimeout())
|
self.assertIsNone(socket.getdefaulttimeout())
|
||||||
socket.setdefaulttimeout(30)
|
socket.setdefaulttimeout(test_support.LOOPBACK_TIMEOUT)
|
||||||
try:
|
try:
|
||||||
pop = poplib.POP3(HOST, self.port)
|
pop = poplib.POP3(HOST, self.port)
|
||||||
finally:
|
finally:
|
||||||
socket.setdefaulttimeout(None)
|
socket.setdefaulttimeout(None)
|
||||||
self.assertEqual(pop.sock.gettimeout(), 30)
|
self.assertEqual(pop.sock.gettimeout(), test_support.LOOPBACK_TIMEOUT)
|
||||||
pop.close()
|
pop.close()
|
||||||
|
|
||||||
def testTimeoutNone(self):
|
def testTimeoutNone(self):
|
||||||
|
@ -524,9 +524,11 @@ class TestTimeouts(TestCase):
|
||||||
pop.close()
|
pop.close()
|
||||||
|
|
||||||
def testTimeoutValue(self):
|
def testTimeoutValue(self):
|
||||||
pop = poplib.POP3(HOST, self.port, timeout=30)
|
pop = poplib.POP3(HOST, self.port, timeout=test_support.LOOPBACK_TIMEOUT)
|
||||||
self.assertEqual(pop.sock.gettimeout(), 30)
|
self.assertEqual(pop.sock.gettimeout(), test_support.LOOPBACK_TIMEOUT)
|
||||||
pop.close()
|
pop.close()
|
||||||
|
with self.assertRaises(ValueError):
|
||||||
|
poplib.POP3(HOST, self.port, timeout=0)
|
||||||
|
|
||||||
|
|
||||||
def test_main():
|
def test_main():
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
:class:`~poplib.POP3` and :class:`~poplib.POP3_SSL` now raise a
|
||||||
|
:class:`ValueError` if the given timeout for their constructor is zero to
|
||||||
|
prevent the creation of a non-blocking socket. Patch by Dong-hee Na.
|
Loading…
Reference in New Issue