summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_email
diff options
context:
space:
mode:
authorR David Murray <rdmurray@bitdance.com>2013-08-22 01:10:31 (GMT)
committerR David Murray <rdmurray@bitdance.com>2013-08-22 01:10:31 (GMT)
commit00ae435deef434f471e39bea3f3ab3a3e3cd90fe (patch)
treeec2589f471e6ee602b6bdf169c87db706ddd1a8c /Lib/test/test_email
parent0b169125caf768b2dce97537d10470b3fdee9ec9 (diff)
downloadcpython-00ae435deef434f471e39bea3f3ab3a3e3cd90fe.zip
cpython-00ae435deef434f471e39bea3f3ab3a3e3cd90fe.tar.gz
cpython-00ae435deef434f471e39bea3f3ab3a3e3cd90fe.tar.bz2
#18324: set_payload now correctly handles binary input.
This also backs out the previous fixes for for #14360, #1717, and #16564. Those bugs were actually caused by the fact that set_payload didn't decode to str, thus rendering the model inconsistent. This fix does mean the data processed by the encoder functions goes through an extra encode/decode cycle, but it means the model is always consistent. Future API updates will provide a better way to encode payloads, which will bypass this minor de-optimization. Tests by Vajrasky Kok.
Diffstat (limited to 'Lib/test/test_email')
-rw-r--r--Lib/test/test_email/test_email.py36
1 files changed, 36 insertions, 0 deletions
diff --git a/Lib/test/test_email/test_email.py b/Lib/test/test_email/test_email.py
index 56be794..e11194b 100644
--- a/Lib/test/test_email/test_email.py
+++ b/Lib/test/test_email/test_email.py
@@ -593,6 +593,42 @@ class TestMessageAPI(TestEmailBase):
"attachment; filename*=utf-8''Fu%C3%9Fballer%20%5Bfilename%5D.ppt",
msg['Content-Disposition'])
+ def test_binary_quopri_payload(self):
+ for charset in ('latin-1', 'ascii'):
+ msg = Message()
+ msg['content-type'] = 'text/plain; charset=%s' % charset
+ msg['content-transfer-encoding'] = 'quoted-printable'
+ msg.set_payload(b'foo=e6=96=87bar')
+ self.assertEqual(
+ msg.get_payload(decode=True),
+ b'foo\xe6\x96\x87bar',
+ 'get_payload returns wrong result with charset %s.' % charset)
+
+ def test_binary_base64_payload(self):
+ for charset in ('latin-1', 'ascii'):
+ msg = Message()
+ msg['content-type'] = 'text/plain; charset=%s' % charset
+ msg['content-transfer-encoding'] = 'base64'
+ msg.set_payload(b'Zm9v5paHYmFy')
+ self.assertEqual(
+ msg.get_payload(decode=True),
+ b'foo\xe6\x96\x87bar',
+ 'get_payload returns wrong result with charset %s.' % charset)
+
+ def test_binary_uuencode_payload(self):
+ for charset in ('latin-1', 'ascii'):
+ for encoding in ('x-uuencode', 'uuencode', 'uue', 'x-uue'):
+ msg = Message()
+ msg['content-type'] = 'text/plain; charset=%s' % charset
+ msg['content-transfer-encoding'] = encoding
+ msg.set_payload(b"begin 666 -\n)9F]OYI:'8F%R\n \nend\n")
+ self.assertEqual(
+ msg.get_payload(decode=True),
+ b'foo\xe6\x96\x87bar',
+ str(('get_payload returns wrong result ',
+ 'with charset {0} and encoding {1}.')).\
+ format(charset, encoding))
+
def test_add_header_with_name_only_param(self):
msg = Message()
msg.add_header('Content-Disposition', 'inline', foo_bar=None)