FazBrowse GitHub Viewer | Trending |
URL:
| Home
Tools: [Download Repo ZIP]   [Original HTTPS Page]

bpo-38615: Add timeout parameter for IMAP4 and IMAP4_SSL constructor by corona10 · Pull Request #17202 · python/cpython · GitHub

/ cpython Public
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension .py  (1) .rst  (3) All 2 file types selected
Viewed files
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Unified
Split
Hide whitespace
Diff view
Unified
Split
Hide whitespace
19 changes: 14 additions & 5 deletions Doc/library/imaplib.rst
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
Original file line number Diff line number Diff line change
Expand Up @@ -30,12 +30,14 @@ Three classes are provided by the :mod:`imaplib` module, :class:`IMAP4` is the
base class:


.. class:: IMAP4(host='', port=IMAP4_PORT)
.. class:: IMAP4(host='', port=IMAP4_PORT[, timeout])

This class implements the actual IMAP4 protocol. The connection is created and
protocol version (IMAP4 or IMAP4rev1) is determined when the instance is
initialized. If *host* is not specified, ``''`` (the local host) is used. If
*port* is omitted, the standard IMAP4 port (143) is used.
*port* is omitted, the standard IMAP4 port (143) is used. The optional *timeout*
parameter specifies a timeout in seconds for the connection attempt
(if not specified, the global default timeout setting will be used).

The :class:`IMAP4` class supports the :keyword:`with` statement. When used
like this, the IMAP4 ``LOGOUT`` command is issued automatically when the
Expand All @@ -50,6 +52,9 @@ base class:
.. versionchanged:: 3.5
Support for the :keyword:`with` statement was added.

.. versionchanged:: 3.9
The optional *timeout* parameter was added.

Three exceptions are defined as attributes of the :class:`IMAP4` class:


Expand Down Expand Up @@ -78,7 +83,7 @@ There's also a subclass for secure connections:


.. class:: IMAP4_SSL(host='', port=IMAP4_SSL_PORT, keyfile=None, \
certfile=None, ssl_context=None)
certfile=None, ssl_context=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT)

This is a subclass derived from :class:`IMAP4` that connects over an SSL
encrypted socket (to use this class you need a socket module that was compiled
Expand All @@ -96,7 +101,7 @@ There's also a subclass for secure connections:
if *keyfile*/*certfile* is provided along with *ssl_context*.

.. versionchanged:: 3.3
*ssl_context* parameter added.
*ssl_context* parameter was added.

.. versionchanged:: 3.4
The class now supports hostname check with
Expand All @@ -110,6 +115,8 @@ There's also a subclass for secure connections:
:func:`ssl.create_default_context` select the system's trusted CA
certificates for you.

.. versionchanged:: 3.9
The optional *timeout* parameter was added.

The second subclass allows for connections created by a child process:

Expand Down Expand Up @@ -353,7 +360,7 @@ An :class:`IMAP4` instance has the following methods:
Send ``NOOP`` to server.


.. method:: IMAP4.open(host, port)
.. method:: IMAP4.open(host, port, timeout)

Opens socket to *port* at *host*. This method is implicitly called by
the :class:`IMAP4` constructor. The connection objects established by this
Expand All @@ -363,6 +370,8 @@ An :class:`IMAP4` instance has the following methods:

.. audit-event:: imaplib.open self,host,port imaplib.IMAP4.open

.. versionchanged:: 3.9
The *timeout* parameter was added.

.. method:: IMAP4.partial(message_num, message_part, start, length)

Expand Down
7 changes: 7 additions & 0 deletions Doc/whatsnew/3.9.rst
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,13 @@ Added constants :data:`~fcntl.F_OFD_GETLK`, :data:`~fcntl.F_OFD_SETLK`
and :data:`~fcntl.F_OFD_SETLKW`.
(Contributed by Dong-hee Na in :issue:`38602`.)

imaplib
-------

The :class:`~imaplib.IMAP4` and :class:`~imaplib.IMAP4_SSL` now has
optional *timeout* parameter for constructor.
(Contributed by Dong-hee Na in :issue:`38615`.)

os
--

Expand Down
33 changes: 19 additions & 14 deletions Lib/imaplib.py
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
Original file line number Diff line number Diff line change
Expand Up @@ -135,10 +135,11 @@ class IMAP4:

r"""IMAP4 client class.

Instantiate with: IMAP4([host[, port]])
Instantiate with: IMAP4([host[, port[, timeout]]])

host - host's name (default: localhost);
port - port number (default: standard IMAP4 port).
timeout - socket timeout (default: socket._GLOBAL_DEFAULT_TIMEOUT))

All IMAP4rev1 commands are supported by methods of the same
name (in lower-case).
Expand Down Expand Up @@ -181,7 +182,8 @@ class error(Exception): pass # Logical errors - debug required
class abort(error): pass # Service errors - close and retry
class readonly(abort): pass # Mailbox status changed to READ-ONLY

def __init__(self, host='', port=IMAP4_PORT):
def __init__(self, host='', port=IMAP4_PORT,
timeout=socket._GLOBAL_DEFAULT_TIMEOUT):
self.debug = Debug
self.state = 'LOGOUT'
self.literal = None # A literal argument to a command
Expand All @@ -195,7 +197,7 @@ def __init__(self, host='', port=IMAP4_PORT):

# Open socket to server.

self.open(host, port)
self.open(host, port, timeout)

try:
self._connect()
Expand Down Expand Up @@ -284,23 +286,24 @@ def __exit__(self, *args):
# Overridable methods


def _create_socket(self):
def _create_socket(self, timeout):
# Default value of IMAP4.host is '', but socket.getaddrinfo()
# (which is used by socket.create_connection()) expects None
# as a default value for host.
host = None if not self.host else self.host
sys.audit("imaplib.open", self, self.host, self.port)
return socket.create_connection((host, self.port))
return socket.create_connection((host, self.port), timeout)

def open(self, host = '', port = IMAP4_PORT):
def open(self, host = '', port = IMAP4_PORT,
timeout = socket._GLOBAL_DEFAULT_TIMEOUT):
"""Setup connection to remote server on "host:port"
(default: localhost:standard IMAP4 port).
This connection will be used by the routines:
read, readline, send, shutdown.
"""
self.host = host
self.port = port
self.sock = self._create_socket()
self.sock = self._create_socket(timeout)
self.file = self.sock.makefile('rb')


Expand Down Expand Up @@ -1261,7 +1264,7 @@ class IMAP4_SSL(IMAP4):

"""IMAP4 client class over SSL connection

Instantiate with: IMAP4_SSL([host[, port[, keyfile[, certfile[, ssl_context]]]]])
Instantiate with: IMAP4_SSL([host[, port[, keyfile[, certfile[, ssl_context[, timeout]]]]]])

host - host's name (default: localhost);
port - port number (default: standard IMAP4 SSL port);
Expand All @@ -1271,13 +1274,14 @@ class IMAP4_SSL(IMAP4):
and private key (default: None)
Note: if ssl_context is provided, then parameters keyfile or
certfile should not be set otherwise ValueError is raised.
timeout - socket timeout (default: socket._GLOBAL_DEFAULT_TIMEOUT)

for more documentation see the docstring of the parent class IMAP4.
"""


def __init__(self, host='', port=IMAP4_SSL_PORT, keyfile=None,
certfile=None, ssl_context=None):
certfile=None, ssl_context=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT):
if ssl_context is not None and keyfile is not None:
raise ValueError("ssl_context and keyfile arguments are mutually "
"exclusive")
Expand All @@ -1294,20 +1298,21 @@ def __init__(self, host='', port=IMAP4_SSL_PORT, keyfile=None,
ssl_context = ssl._create_stdlib_context(certfile=certfile,
keyfile=keyfile)
self.ssl_context = ssl_context
IMAP4.__init__(self, host, port)
IMAP4.__init__(self, host, port, timeout)

def _create_socket(self):
sock = IMAP4._create_socket(self)
def _create_socket(self, timeout):
sock = IMAP4._create_socket(self, timeout)
return self.ssl_context.wrap_socket(sock,
server_hostname=self.host)

def open(self, host='', port=IMAP4_SSL_PORT):
def open(self, host='', port=IMAP4_SSL_PORT,
timeout=socket._GLOBAL_DEFAULT_TIMEOUT):
"""Setup connection to remote server on "host:port".
(default: localhost:standard IMAP4 SSL port).
This connection will be used by the routines:
read, readline, send, shutdown.
"""
IMAP4.open(self, host, port)
IMAP4.open(self, host, port, timeout)

__all__.append("IMAP4_SSL")

Expand Down
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
The :class:`~imaplib.IMAP4` and :class:`~imaplib.IMAP4_SSL` now has optional
*timeout* parameter for constructor. Patch by Dong-hee Na.

Back | FazBrowse Home | New Git URL