Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit f6069f9

Browse files
committed
#14360: make encoders.encode_quopri work.
There were no tests for the encoders module. encode_base64 worked because it is the default and so got tested implicitly elsewhere, and we use encode_7or8bit internally, so that worked, too. I previously fixed encode_noop, so this fix means that everythign in the encoders module now works, hopefully correctly. Also added an explicit test for encode_base64.
1 parent c7f7579 commit f6069f9

2 files changed

Lines changed: 35 additions & 2 deletions

File tree

Lib/email/encoders.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
def _qencode(s):
2121
enc = _encodestring(s, quotetabs=True)
2222
# Must encode spaces, which quopri.encodestring() doesn't do
23-
return enc.replace(' ', '=20')
23+
return enc.replace(b' ', b'=20')
2424

2525

2626
def encode_base64(msg):
@@ -41,8 +41,12 @@ def encode_quopri(msg):
4141
Also, add an appropriate Content-Transfer-Encoding header.
4242
"""
4343
orig = msg.get_payload()
44+
if isinstance(orig, str):
45+
# If it is a string, the model data may have binary data encoded in via
46+
# surrogateescape. Convert back to bytes so we can CTE encode it.
47+
orig = orig.encode('ascii', 'surrogateescape')
4448
encdata = _qencode(orig)
45-
msg.set_payload(encdata)
49+
msg.set_payload(encdata.decode('ascii', 'surrogateescape'))
4650
msg['Content-Transfer-Encoding'] = 'quoted-printable'
4751

4852

Lib/test/test_email/test_email.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1474,6 +1474,35 @@ def test_binary_body_with_encode_noop(self):
14741474
self.assertEqual(msg.get_payload(), '\uFFFD' * len(bytesdata))
14751475
self.assertEqual(msg2.get_payload(decode=True), bytesdata)
14761476

1477+
def test_binary_body_with_encode_quopri(self):
1478+
# Issue 14360.
1479+
bytesdata = b'\xfa\xfb\xfc\xfd\xfe\xff '
1480+
msg = MIMEApplication(bytesdata, _encoder=encoders.encode_quopri)
1481+
self.assertEqual(msg.get_payload(), '=FA=FB=FC=FD=FE=FF=20')
1482+
self.assertEqual(msg.get_payload(decode=True), bytesdata)
1483+
self.assertEqual(msg['Content-Transfer-Encoding'], 'quoted-printable')
1484+
s = BytesIO()
1485+
g = BytesGenerator(s)
1486+
g.flatten(msg)
1487+
wireform = s.getvalue()
1488+
msg2 = email.message_from_bytes(wireform)
1489+
self.assertEqual(msg.get_payload(), '=FA=FB=FC=FD=FE=FF=20')
1490+
self.assertEqual(msg2.get_payload(decode=True), bytesdata)
1491+
self.assertEqual(msg2['Content-Transfer-Encoding'], 'quoted-printable')
1492+
1493+
def test_binary_body_with_encode_base64(self):
1494+
bytesdata = b'\xfa\xfb\xfc\xfd\xfe\xff'
1495+
msg = MIMEApplication(bytesdata, _encoder=encoders.encode_base64)
1496+
self.assertEqual(msg.get_payload(), '+vv8/f7/\n')
1497+
self.assertEqual(msg.get_payload(decode=True), bytesdata)
1498+
s = BytesIO()
1499+
g = BytesGenerator(s)
1500+
g.flatten(msg)
1501+
wireform = s.getvalue()
1502+
msg2 = email.message_from_bytes(wireform)
1503+
self.assertEqual(msg.get_payload(), '+vv8/f7/\n')
1504+
self.assertEqual(msg2.get_payload(decode=True), bytesdata)
1505+
14771506

14781507
# Test the basic MIMEText class
14791508
class TestMIMEText(unittest.TestCase):

0 commit comments

Comments
 (0)