summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBerker Peksag <berker.peksag@gmail.com>2018-08-07 02:12:18 (GMT)
committerGitHub <noreply@github.com>2018-08-07 02:12:18 (GMT)
commite4dcbbd7f4ac18d01c0ec85f64ae98b8281ed403 (patch)
treec1d8a7e7689aeb7add213b4f289161dbfdff2c81
parent3c1b590472d567e22a607ba31271865cd90c8e9b (diff)
downloadcpython-e4dcbbd7f4ac18d01c0ec85f64ae98b8281ed403.zip
cpython-e4dcbbd7f4ac18d01c0ec85f64ae98b8281ed403.tar.gz
cpython-e4dcbbd7f4ac18d01c0ec85f64ae98b8281ed403.tar.bz2
bpo-18540: Fix EAI_NONAME in imaplib.IMAP4*() (GH-8634)
-rw-r--r--Lib/imaplib.py6
-rw-r--r--Lib/test/test_imaplib.py14
-rw-r--r--Misc/NEWS.d/next/Library/2018-08-02-21-28-38.bpo-18540.AryoYY.rst3
3 files changed, 22 insertions, 1 deletions
diff --git a/Lib/imaplib.py b/Lib/imaplib.py
index 0dfd852..e451413 100644
--- a/Lib/imaplib.py
+++ b/Lib/imaplib.py
@@ -282,7 +282,11 @@ class IMAP4:
def _create_socket(self):
- return socket.create_connection((self.host, self.port))
+ # 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
+ return socket.create_connection((host, self.port))
def open(self, host = '', port = IMAP4_PORT):
"""Setup connection to remote server on "host:port"
diff --git a/Lib/test/test_imaplib.py b/Lib/test/test_imaplib.py
index f16bacd..a0b598d 100644
--- a/Lib/test/test_imaplib.py
+++ b/Lib/test/test_imaplib.py
@@ -1,6 +1,7 @@
from test import support
from contextlib import contextmanager
+import errno
import imaplib
import os.path
import socketserver
@@ -69,6 +70,19 @@ class TestImaplib(unittest.TestCase):
for t in self.timevalues():
imaplib.Time2Internaldate(t)
+ def test_imap4_host_default_value(self):
+ expected_errnos = [
+ # This is the exception that should be raised.
+ errno.ECONNREFUSED,
+ ]
+ if hasattr(errno, 'EADDRNOTAVAIL'):
+ # socket.create_connection() fails randomly with
+ # EADDRNOTAVAIL on Travis CI.
+ expected_errnos.append(errno.EADDRNOTAVAIL)
+ with self.assertRaises(OSError) as cm:
+ imaplib.IMAP4()
+ self.assertIn(cm.exception.errno, expected_errnos)
+
if ssl:
class SecureTCPServer(socketserver.TCPServer):
diff --git a/Misc/NEWS.d/next/Library/2018-08-02-21-28-38.bpo-18540.AryoYY.rst b/Misc/NEWS.d/next/Library/2018-08-02-21-28-38.bpo-18540.AryoYY.rst
new file mode 100644
index 0000000..3ffd9f6
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2018-08-02-21-28-38.bpo-18540.AryoYY.rst
@@ -0,0 +1,3 @@
+The :class:`imaplib.IMAP4` and :class:`imaplib.IMAP4_SSL` classes now
+resolve to the local host IP correctly when the default value of *host*
+parameter (``''``) is used.