Kaydet (Commit) dc74e34e authored tarafından Barry Warsaw's avatar Barry Warsaw

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).
üst f5853f75
...@@ -23,6 +23,12 @@ except NameError: ...@@ -23,6 +23,12 @@ except NameError:
True = 1 True = 1
False = 0 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 # 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 # 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 # most headers found in the wild. We may eventually need a full fledged
...@@ -220,7 +226,7 @@ class Message: ...@@ -220,7 +226,7 @@ class Message:
elif cte in ('x-uuencode', 'uuencode', 'uue', 'x-uue'): elif cte in ('x-uuencode', 'uuencode', 'uue', 'x-uue'):
sfp = StringIO() sfp = StringIO()
try: try:
uu.decode(StringIO(payload+'\n'), sfp) quiet_uu_decode(StringIO(payload+'\n'), sfp, quiet=True)
payload = sfp.getvalue() payload = sfp.getvalue()
except uu.Error: except uu.Error:
# Some decoding problem # Some decoding problem
......
# Copyright (C) 2002 Python Software Foundation # Copyright (C) 2002-2006 Python Software Foundation
# Author: barry@zope.com # 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 cStringIO import StringIO
from types import StringType, UnicodeType from types import StringType, UnicodeType
...@@ -67,3 +69,14 @@ def typed_subpart_iterator(msg, maintype='text', subtype=None): ...@@ -67,3 +69,14 @@ def typed_subpart_iterator(msg, maintype='text', subtype=None):
if subtype is None or subpart.get_content_subtype() == subtype: if subtype is None or subpart.get_content_subtype() == subtype:
parts.append(subpart) parts.append(subpart)
return parts 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
# Copyright (C) 2002 Python Software Foundation # Copyright (C) 2002-2006 Python Software Foundation
# Author: barry@zope.com # 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 from __future__ import generators
...@@ -9,6 +10,8 @@ from __future__ import division ...@@ -9,6 +10,8 @@ from __future__ import division
from cStringIO import StringIO from cStringIO import StringIO
from types import StringTypes from types import StringTypes
import uu
# Python 2.2.x where x < 1 lacks True/False # Python 2.2.x where x < 1 lacks True/False
try: try:
True, False True, False
...@@ -68,3 +71,8 @@ def typed_subpart_iterator(msg, maintype='text', subtype=None): ...@@ -68,3 +71,8 @@ def typed_subpart_iterator(msg, maintype='text', subtype=None):
if subpart.get_content_maintype() == maintype: if subpart.get_content_maintype() == maintype:
if subtype is None or subpart.get_content_subtype() == subtype: if subtype is None or subpart.get_content_subtype() == subtype:
yield subpart yield subpart
def quiet_uu_decode(in_file, out_file, quiet):
uu.decode(in_file, out_file, quiet=quiet)
...@@ -222,6 +222,19 @@ class TestMessageAPI(TestEmailBase): ...@@ -222,6 +222,19 @@ class TestMessageAPI(TestEmailBase):
msg.set_payload('foo') msg.set_payload('foo')
eq(msg.get_payload(decode=True), '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): def test_decoded_generator(self):
eq = self.assertEqual eq = self.assertEqual
msg = self._msgobj('msg_07.txt') msg = self._msgobj('msg_07.txt')
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment