summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
Diffstat (limited to 'Lib')
-rw-r--r--Lib/email/message.py8
-rw-r--r--Lib/test/test_email/test_email.py44
-rw-r--r--Lib/test/test_email/test_headerregistry.py5
3 files changed, 55 insertions, 2 deletions
diff --git a/Lib/email/message.py b/Lib/email/message.py
index a58afc5..87fcab6 100644
--- a/Lib/email/message.py
+++ b/Lib/email/message.py
@@ -286,8 +286,12 @@ class Message:
if i is not None and not isinstance(self._payload, list):
raise TypeError('Expected list, got %s' % type(self._payload))
payload = self._payload
- # cte might be a Header, so for now stringify it.
- cte = str(self.get('content-transfer-encoding', '')).lower()
+ cte = self.get('content-transfer-encoding', '')
+ if hasattr(cte, 'cte'):
+ cte = cte.cte
+ else:
+ # cte might be a Header, so for now stringify it.
+ cte = str(cte).strip().lower()
# payload may be bytes here.
if not decode:
if isinstance(payload, str) and utils._has_surrogates(payload):
diff --git a/Lib/test/test_email/test_email.py b/Lib/test/test_email/test_email.py
index abe9ef2..2deb357 100644
--- a/Lib/test/test_email/test_email.py
+++ b/Lib/test/test_email/test_email.py
@@ -810,6 +810,16 @@ class TestMessageAPI(TestEmailBase):
w4kgdGVzdGFiYwo=
"""))
+ def test_string_payload_with_base64_cte(self):
+ msg = email.message_from_string(textwrap.dedent("""\
+ Content-Transfer-Encoding: base64
+
+ SGVsbG8uIFRlc3Rpbmc=
+ """), policy=email.policy.default)
+ self.assertEqual(msg.get_payload(decode=True), b"Hello. Testing")
+ self.assertDefectsEqual(msg['content-transfer-encoding'].defects, [])
+
+
# Test the email.encoders module
class TestEncoders(unittest.TestCase):
@@ -2352,6 +2362,40 @@ counter to RFC 2822, there's no separating newline here
self.assertDefectsEqual(msg.defects,
[errors.MissingHeaderBodySeparatorDefect])
+ def test_string_payload_with_extra_space_after_cte(self):
+ # https://github.com/python/cpython/issues/98188
+ cte = "base64 "
+ msg = email.message_from_string(textwrap.dedent(f"""\
+ Content-Transfer-Encoding: {cte}
+
+ SGVsbG8uIFRlc3Rpbmc=
+ """), policy=email.policy.default)
+ self.assertEqual(msg.get_payload(decode=True), b"Hello. Testing")
+ self.assertDefectsEqual(msg['content-transfer-encoding'].defects, [])
+
+ def test_string_payload_with_extra_text_after_cte(self):
+ msg = email.message_from_string(textwrap.dedent("""\
+ Content-Transfer-Encoding: base64 some text
+
+ SGVsbG8uIFRlc3Rpbmc=
+ """), policy=email.policy.default)
+ self.assertEqual(msg.get_payload(decode=True), b"Hello. Testing")
+ cte = msg['content-transfer-encoding']
+ self.assertDefectsEqual(cte.defects, [email.errors.InvalidHeaderDefect])
+
+ def test_string_payload_with_extra_space_after_cte_compat32(self):
+ cte = "base64 "
+ msg = email.message_from_string(textwrap.dedent(f"""\
+ Content-Transfer-Encoding: {cte}
+
+ SGVsbG8uIFRlc3Rpbmc=
+ """), policy=email.policy.compat32)
+ pasted_cte = msg['content-transfer-encoding']
+ self.assertEqual(pasted_cte, cte)
+ self.assertEqual(msg.get_payload(decode=True), b"Hello. Testing")
+ self.assertDefectsEqual(msg.defects, [])
+
+
# Test RFC 2047 header encoding and decoding
class TestRFC2047(TestEmailBase):
diff --git a/Lib/test/test_email/test_headerregistry.py b/Lib/test/test_email/test_headerregistry.py
index 4c0523f..ff7a6da 100644
--- a/Lib/test/test_email/test_headerregistry.py
+++ b/Lib/test/test_email/test_headerregistry.py
@@ -837,6 +837,11 @@ class TestContentTransferEncoding(TestHeaderBase):
'7bit',
[errors.InvalidHeaderDefect]),
+ 'extra_space_after_cte': (
+ 'base64 ',
+ 'base64',
+ []),
+
}