mirror of https://github.com/python/cpython
gh-77749: Fix inconsistent behavior of non-ASCII handling in EmailPolicy.fold() (GH-6986)
It now always encodes non-ASCII characters in headers if utf8 is false. Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
This commit is contained in:
parent
0bd8297a22
commit
504334c7be
|
@ -210,8 +210,15 @@ class EmailPolicy(Policy):
|
||||||
self.refold_source == 'long' and
|
self.refold_source == 'long' and
|
||||||
(lines and len(lines[0])+len(name)+2 > maxlen or
|
(lines and len(lines[0])+len(name)+2 > maxlen or
|
||||||
any(len(x) > maxlen for x in lines[1:])))
|
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 self.header_factory(name, ''.join(lines)).fold(policy=self)
|
||||||
|
|
||||||
return name + ': ' + self.linesep.join(lines) + self.linesep
|
return name + ': ' + self.linesep.join(lines) + self.linesep
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -135,6 +135,23 @@ class PolicyAPITests(unittest.TestCase):
|
||||||
for attr, value in expected.items():
|
for attr, value in expected.items():
|
||||||
self.assertEqual(getattr(added, attr), value)
|
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):
|
def test_fold_zero_max_line_length(self):
|
||||||
expected = 'Subject: =?utf-8?q?=C3=A1?=\n'
|
expected = 'Subject: =?utf-8?q?=C3=A1?=\n'
|
||||||
|
|
||||||
|
|
|
@ -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.
|
Loading…
Reference in New Issue