]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-77749: Fix inconsistent behavior of non-ASCII handling in EmailPolicy.fold() ...
authorRito Takeuchi <licht-t@outlook.jp>
Fri, 26 Jan 2024 15:19:41 +0000 (00:19 +0900)
committerGitHub <noreply@github.com>
Fri, 26 Jan 2024 15:19:41 +0000 (15:19 +0000)
It now always encodes non-ASCII characters in headers if utf8 is false.

Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
Lib/email/policy.py
Lib/test/test_email/test_policy.py
Misc/NEWS.d/next/Library/2024-01-26-16-46-21.gh-issue-77749.NY_7TS.rst [new file with mode: 0644]

index 611deb50bb5290e193942236f691be6979a1f73c..8816c84ed175a709cef85329461185b40efa610a 100644 (file)
@@ -210,8 +210,15 @@ class EmailPolicy(Policy):
                   self.refold_source == 'long' and
                     (lines and len(lines[0])+len(name)+2 > maxlen or
                      any(len(x) > maxlen for x in lines[1:])))
-        if refold or refold_binary and _has_surrogates(value):
+
+        if not refold:
+            if not self.utf8:
+                refold = not value.isascii()
+            elif refold_binary:
+                refold = _has_surrogates(value)
+        if refold:
             return self.header_factory(name, ''.join(lines)).fold(policy=self)
+
         return name + ': ' + self.linesep.join(lines) + self.linesep
 
 
index e87c275549406d14b8d9af61ffcfc5a6cb64d90d..c6b9c80efe1b54a62815ab63c05c66105099f48d 100644 (file)
@@ -135,6 +135,23 @@ class PolicyAPITests(unittest.TestCase):
         for attr, value in expected.items():
             self.assertEqual(getattr(added, attr), value)
 
+    def test_fold_utf8(self):
+        expected_ascii = 'Subject: =?utf-8?q?=C3=A1?=\n'
+        expected_utf8 = 'Subject: á\n'
+
+        msg = email.message.EmailMessage()
+        s = 'á'
+        msg['Subject'] = s
+
+        p_ascii = email.policy.default.clone()
+        p_utf8 = email.policy.default.clone(utf8=True)
+
+        self.assertEqual(p_ascii.fold('Subject', msg['Subject']), expected_ascii)
+        self.assertEqual(p_utf8.fold('Subject', msg['Subject']), expected_utf8)
+
+        self.assertEqual(p_ascii.fold('Subject', s), expected_ascii)
+        self.assertEqual(p_utf8.fold('Subject', s), expected_utf8)
+
     def test_fold_zero_max_line_length(self):
         expected = 'Subject: =?utf-8?q?=C3=A1?=\n'
 
diff --git a/Misc/NEWS.d/next/Library/2024-01-26-16-46-21.gh-issue-77749.NY_7TS.rst b/Misc/NEWS.d/next/Library/2024-01-26-16-46-21.gh-issue-77749.NY_7TS.rst
new file mode 100644 (file)
index 0000000..f1c99c0
--- /dev/null
@@ -0,0 +1,2 @@
+:meth:`email.policy.EmailPolicy.fold` now always encodes non-ASCII characters
+in headers if :attr:`~email.policy.EmailPolicy.utf8` is false.