Skip to content

Commit

Permalink
gh-77749: Fix inconsistent behavior of non-ASCII handling in EmailPol…
Browse files Browse the repository at this point in the history
…icy.fold() (GH-6986)

It now always encodes non-ASCII characters in headers if utf8 is false.

Co-authored-by: Serhiy Storchaka <[email protected]>
  • Loading branch information
Licht-T and serhiy-storchaka authored Jan 26, 2024
1 parent 0bd8297 commit 504334c
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 1 deletion.
9 changes: 8 additions & 1 deletion Lib/email/policy.py
Original file line number Diff line number Diff line change
Expand Up @@ -210,8 +210,15 @@ def _fold(self, name, value, refold_binary=False):
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


Expand Down
17 changes: 17 additions & 0 deletions Lib/test/test_email/test_policy.py
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,23 @@ def test_policy_addition(self):
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'

Expand Down
Original file line number Diff line number Diff line change
@@ -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.

0 comments on commit 504334c

Please sign in to comment.