summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBarry Warsaw <barry@python.org>2006-02-09 04:03:22 +0000
committerBarry Warsaw <barry@python.org>2006-02-09 04:03:22 +0000
commitdc74e34e24d01323cfb89a0a5c11416f85adebd0 (patch)
tree12e2095867f0d85fb2716d884b29bb1e6d482d43
parentf5853f7592fac39e7f6d0bccc0884b666b9edd99 (diff)
downloadcpython-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.py8
-rw-r--r--Lib/email/_compat21.py21
-rw-r--r--Lib/email/_compat22.py14
-rw-r--r--Lib/email/test/test_email.py13
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')