]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
#21804: Add RFC 6856 (UTF8) support to poplib.
authorR David Murray <rdmurray@bitdance.com>
Sat, 16 May 2015 19:05:53 +0000 (15:05 -0400)
committerR David Murray <rdmurray@bitdance.com>
Sat, 16 May 2015 19:05:53 +0000 (15:05 -0400)
Patch by Milan Oberkirch.

Doc/library/poplib.rst
Doc/whatsnew/3.5.rst
Lib/poplib.py
Lib/test/test_poplib.py
Misc/NEWS

index 45baad96afa6acb10fa8ff87d9ab26cdcec22d7e..fee6298076ac2321da2fd14306cd872cb60d5fee 100644 (file)
@@ -194,6 +194,15 @@ An :class:`POP3` instance has the following methods:
    the unique id for that message in the form ``'response mesgnum uid``, otherwise
    result is list ``(response, ['mesgnum uid', ...], octets)``.
 
+
+.. method:: POP3.utf8()
+
+   Try to switch to UTF-8 mode. Returns the server response if sucessful,
+   raises :class:`error_proto` if not. Specified in :RFC:`6856`.
+
+   .. versionadded:: 3.5
+
+
 .. method:: POP3.stls(context=None)
 
    Start a TLS session on the active connection as specified in :rfc:`2595`.
index 86173a0f45f88101b8d1b83cf4ca1f4df68f6f44..64116673397a58d72f0121af39ebee592a5118b9 100644 (file)
@@ -452,6 +452,13 @@ pickle
   classes) now are supported with pickle protocols < 4.
   (Contributed by Serhiy Storchaka in :issue:`23611`.)
 
+poplib
+------
+
+* A new command :meth:`~poplib.POP3.utf8` enables :rfc:`6856`
+  (internationalized email) support if the POP server supports it.  (Contributed
+  by Milan OberKirch in :issue:`21804`.)
+
 re
 --
 
index 4915628b03febbc578ceafc371f0d301c6e80f38..f6723904e859e12d871aa71c88a426e911372e95 100644 (file)
@@ -71,6 +71,7 @@ class POP3:
             UIDL [msg]              uidl(msg = None)
             CAPA                    capa()
             STLS                    stls()
+            UTF8                    utf8()
 
     Raises one exception: 'error_proto'.
 
@@ -348,6 +349,12 @@ class POP3:
         return self._longcmd('UIDL')
 
 
+    def utf8(self):
+        """Try to enter UTF-8 mode (see RFC 6856). Returns server response.
+        """
+        return self._shortcmd('UTF8')
+
+
     def capa(self):
         """Return server capabilities (RFC 2449) as a dictionary
         >>> c=poplib.POP3('localhost')
index 14a519d8ecc29f2e65576ef58c727d9ae4761d0a..bceeb93ad14a45088de0cbae2ac9dea9acf49f6a 100644 (file)
@@ -44,6 +44,7 @@ line3\r\n\
 class DummyPOP3Handler(asynchat.async_chat):
 
     CAPAS = {'UIDL': [], 'IMPLEMENTATION': ['python-testlib-pop-server']}
+    enable_UTF8 = False
 
     def __init__(self, conn):
         asynchat.async_chat.__init__(self, conn)
@@ -142,6 +143,11 @@ class DummyPOP3Handler(asynchat.async_chat):
                 self.push(' '.join(_ln))
         self.push('.')
 
+    def cmd_utf8(self, arg):
+        self.push('+OK I know RFC6856'
+                  if self.enable_UTF8
+                  else '-ERR What is UTF8?!')
+
     if SUPPORTS_SSL:
 
         def cmd_stls(self, arg):
@@ -309,6 +315,16 @@ class TestPOP3Class(TestCase):
         self.client.uidl()
         self.client.uidl('foo')
 
+    def test_utf8_raises_if_unsupported(self):
+        self.server.handler.enable_UTF8 = False
+        self.assertRaises(poplib.error_proto, self.client.utf8)
+
+    def test_utf8(self):
+        self.server.handler.enable_UTF8 = True
+        expected = b'+OK I know RFC6856'
+        result = self.client.utf8()
+        self.assertEqual(result, expected)
+
     def test_capa(self):
         capa = self.client.capa()
         self.assertTrue('IMPLEMENTATION' in capa.keys())
index 1b23a9867aafaae5bc08c49dc986c7aeef14718e..3d59983a6c2d4199ad484735894085a69463f433 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -47,6 +47,8 @@ Core and Builtins
 Library
 -------
 
+- Issue #21804: poplib now supports RFC 6856 (UTF8).
+
 - Issue #18682: Optimized pprint functions for builtin scalar types.
 
 - Issue #22027: smtplib now supports RFC 6531 (SMTPUTF8).