diff options
author | R David Murray <rdmurray@bitdance.com> | 2013-12-11 21:52:11 (GMT) |
---|---|---|
committer | R David Murray <rdmurray@bitdance.com> | 2013-12-11 21:52:11 (GMT) |
commit | 50bfbb9903171c96c19359fd50fb6a5570128ef6 (patch) | |
tree | e275522a82b7244c17ffa19ef23e52d688ac6bc8 /Lib/test/test_email | |
parent | 34bd9fc59a36f9803777f0446bc461083bdec78e (diff) | |
download | cpython-50bfbb9903171c96c19359fd50fb6a5570128ef6.zip cpython-50bfbb9903171c96c19359fd50fb6a5570128ef6.tar.gz cpython-50bfbb9903171c96c19359fd50fb6a5570128ef6.tar.bz2 |
#19063: fix set_payload handling of non-ASCII string input.
This version of the fix raises an error instead of accepting the invalid
input (ie: if a non-ASCII string is used but no charset is specified).
Diffstat (limited to 'Lib/test/test_email')
-rw-r--r-- | Lib/test/test_email/test_contentmanager.py | 5 | ||||
-rw-r--r-- | Lib/test/test_email/test_email.py | 52 |
2 files changed, 42 insertions, 15 deletions
diff --git a/Lib/test/test_email/test_contentmanager.py b/Lib/test/test_email/test_contentmanager.py index 1629e2d..fa2d3d2 100644 --- a/Lib/test/test_email/test_contentmanager.py +++ b/Lib/test/test_email/test_contentmanager.py @@ -208,12 +208,11 @@ class TestRawDataManager(TestEmailBase): "Basìc tëxt.\n") def test_get_text_plain_utf8_base64_recoverable_bad_CTE_data(self): - m = self._str_msg(textwrap.dedent("""\ + m = self._bytes_msg(textwrap.dedent("""\ Content-Type: text/plain; charset="utf8" Content-Transfer-Encoding: base64 - QmFzw6xjIHTDq3h0Lgo\xFF= - """)) + QmFzw6xjIHTDq3h0Lgo""").encode('ascii') + b'\xFF=\n') self.assertEqual(raw_data_manager.get_content(m, errors='ignore'), "Basìc tëxt.\n") diff --git a/Lib/test/test_email/test_email.py b/Lib/test/test_email/test_email.py index 57f12ae..51a9438 100644 --- a/Lib/test/test_email/test_email.py +++ b/Lib/test/test_email/test_email.py @@ -92,6 +92,44 @@ class TestMessageAPI(TestEmailBase): msg.set_payload('This is a string payload', charset) self.assertEqual(msg.get_charset().input_charset, 'iso-8859-1') + def test_set_payload_with_8bit_data_and_charset(self): + data = b'\xd0\x90\xd0\x91\xd0\x92' + charset = Charset('utf-8') + msg = Message() + msg.set_payload(data, charset) + self.assertEqual(msg['content-transfer-encoding'], 'base64') + self.assertEqual(msg.get_payload(decode=True), data) + self.assertEqual(msg.get_payload(), '0JDQkdCS\n') + + def test_set_payload_with_non_ascii_and_charset_body_encoding_none(self): + data = b'\xd0\x90\xd0\x91\xd0\x92' + charset = Charset('utf-8') + charset.body_encoding = None # Disable base64 encoding + msg = Message() + msg.set_payload(data.decode('utf-8'), charset) + self.assertEqual(msg['content-transfer-encoding'], '8bit') + self.assertEqual(msg.get_payload(decode=True), data) + + def test_set_payload_with_8bit_data_and_charset_body_encoding_none(self): + data = b'\xd0\x90\xd0\x91\xd0\x92' + charset = Charset('utf-8') + charset.body_encoding = None # Disable base64 encoding + msg = Message() + msg.set_payload(data, charset) + self.assertEqual(msg['content-transfer-encoding'], '8bit') + self.assertEqual(msg.get_payload(decode=True), data) + + def test_set_payload_to_list(self): + msg = Message() + msg.set_payload([]) + self.assertEqual(msg.get_payload(), []) + + def test_set_payload_with_non_ascii_and_no_charset_raises(self): + data = b'\xd0\x90\xd0\x91\xd0\x92'.decode('utf-8') + msg = Message() + with self.assertRaises(TypeError): + msg.set_payload(data) + def test_get_charsets(self): eq = self.assertEqual @@ -558,20 +596,10 @@ class TestMessageAPI(TestEmailBase): self.assertIsInstance(msg.defects[0], errors.InvalidBase64CharactersDefect) - def test_broken_unicode_payload(self): - # This test improves coverage but is not a compliance test. - # The behavior in this situation is currently undefined by the API. - x = 'this is a br\xf6ken thing to do' - msg = Message() - msg['content-type'] = 'text/plain' - msg['content-transfer-encoding'] = '8bit' - msg.set_payload(x) - self.assertEqual(msg.get_payload(decode=True), - bytes(x, 'raw-unicode-escape')) - def test_questionable_bytes_payload(self): # This test improves coverage but is not a compliance test, - # since it involves poking inside the black box. + # since it involves poking inside the black box in a way + # that actually breaks the model invariants. x = 'this is a quéstionable thing to do'.encode('utf-8') msg = Message() msg['content-type'] = 'text/plain; charset="utf-8"' |