diff options
author | Barry Warsaw <barry@python.org> | 2006-02-09 04:03:22 +0000 |
---|---|---|
committer | Barry Warsaw <barry@python.org> | 2006-02-09 04:03:22 +0000 |
commit | dc74e34e24d01323cfb89a0a5c11416f85adebd0 (patch) | |
tree | 12e2095867f0d85fb2716d884b29bb1e6d482d43 | |
parent | f5853f7592fac39e7f6d0bccc0884b666b9edd99 (diff) | |
download | cpython-git-dc74e34e24d01323cfb89a0a5c11416f85adebd0.tar.gz |
Resolve SF bug 1409403: email.Message should supress warning from uu.decode.
However, the patch in that tracker item is elaborated such that the newly
included unit test pass on Python 2.1 through 2.5. Note that Python 2.1's
uu.decode() does not have a 'quiet' argument, so we have to be sneaky.
Will port to email 3.0 (although without the backward compatible sneakiness).
-rw-r--r-- | Lib/email/Message.py | 8 | ||||
-rw-r--r-- | Lib/email/_compat21.py | 21 | ||||
-rw-r--r-- | Lib/email/_compat22.py | 14 | ||||
-rw-r--r-- | Lib/email/test/test_email.py | 13 |
4 files changed, 48 insertions, 8 deletions
diff --git a/Lib/email/Message.py b/Lib/email/Message.py index bb8718fe23..1f23965c91 100644 --- a/Lib/email/Message.py +++ b/Lib/email/Message.py @@ -23,6 +23,12 @@ except NameError: True = 1 False = 0 +try: + from email._compat22 import quiet_uu_decode +except SyntaxError: + from email._compat21 import quiet_uu_decode + + # Regular expression used to split header parameters. BAW: this may be too # simple. It isn't strictly RFC 2045 (section 5.1) compliant, but it catches # most headers found in the wild. We may eventually need a full fledged @@ -220,7 +226,7 @@ class Message: elif cte in ('x-uuencode', 'uuencode', 'uue', 'x-uue'): sfp = StringIO() try: - uu.decode(StringIO(payload+'\n'), sfp) + quiet_uu_decode(StringIO(payload+'\n'), sfp, quiet=True) payload = sfp.getvalue() except uu.Error: # Some decoding problem diff --git a/Lib/email/_compat21.py b/Lib/email/_compat21.py index 1e1f66692f..0cd987fe31 100644 --- a/Lib/email/_compat21.py +++ b/Lib/email/_compat21.py @@ -1,8 +1,10 @@ -# Copyright (C) 2002 Python Software Foundation -# Author: barry@zope.com +# Copyright (C) 2002-2006 Python Software Foundation +# Author: barry@python.org -"""Module containing compatibility functions for Python 2.1. -""" +"""Module containing compatibility functions for Python 2.1.""" + +import uu +import sys from cStringIO import StringIO from types import StringType, UnicodeType @@ -67,3 +69,14 @@ def typed_subpart_iterator(msg, maintype='text', subtype=None): if subtype is None or subpart.get_content_subtype() == subtype: parts.append(subpart) return parts + + + +def quiet_uu_decode(in_file, out_file, quiet): + # In Python 2.1, uu.decode() does not support the quiet flag. Cheat. + old_stderr = sys.stderr + try: + sys.stderr = StringIO() + uu.decode(in_file, out_file) + finally: + sys.stderr = old_stderr diff --git a/Lib/email/_compat22.py b/Lib/email/_compat22.py index fc1d32a555..85d4f9e1e6 100644 --- a/Lib/email/_compat22.py +++ b/Lib/email/_compat22.py @@ -1,7 +1,8 @@ -# Copyright (C) 2002 Python Software Foundation -# Author: barry@zope.com +# Copyright (C) 2002-2006 Python Software Foundation +# Author: barry@python.org -"""Module containing compatibility functions for Python 2.2. +"""Module containing compatibility functions for Python 2.2 (and possibly +beyond. """ from __future__ import generators @@ -9,6 +10,8 @@ from __future__ import division from cStringIO import StringIO from types import StringTypes +import uu + # Python 2.2.x where x < 1 lacks True/False try: True, False @@ -68,3 +71,8 @@ def typed_subpart_iterator(msg, maintype='text', subtype=None): if subpart.get_content_maintype() == maintype: if subtype is None or subpart.get_content_subtype() == subtype: yield subpart + + + +def quiet_uu_decode(in_file, out_file, quiet): + uu.decode(in_file, out_file, quiet=quiet) diff --git a/Lib/email/test/test_email.py b/Lib/email/test/test_email.py index edb65e32a8..fb2e488a1b 100644 --- a/Lib/email/test/test_email.py +++ b/Lib/email/test/test_email.py @@ -222,6 +222,19 @@ class TestMessageAPI(TestEmailBase): msg.set_payload('foo') eq(msg.get_payload(decode=True), 'foo') + def test_decode_bogus_uu_payload_quietly(self): + msg = Message() + msg.set_payload('begin 664 foo.txt\n%<W1F=0000H \n \nend\n') + msg['Content-Transfer-Encoding'] = 'x-uuencode' + old_stderr = sys.stderr + try: + sys.stderr = sfp = StringIO() + # We don't care about the payload + msg.get_payload(decode=True) + finally: + sys.stderr = old_stderr + self.assertEqual(sfp.getvalue(), '') + def test_decoded_generator(self): eq = self.assertEqual msg = self._msgobj('msg_07.txt') |