https://github.com/python/cpython/commit/5a22a62b96a68c2dd31784c5e3427ad7b365388a
commit: 5a22a62b96a68c2dd31784c5e3427ad7b365388a
branch: main
author: R. David Murray <[email protected]>
committer: bitdancer <[email protected]>
date: 2026-10-09T08:54:09-04:00
summary:
gh-87720 Fix additional header refolding-quoting edge case (#134271)
In this case, the higher level syntactic unit fit on the remainder of
the line in un-encoded format, and that higher level unit was
not a ptext or vtext, so the encoding check failed. To fix this, we
look inside the current unit to see if has anything that was
originally encoded.
files:
A Misc/NEWS.d/next/Library/2026-10-08-16-18-43.gh-issue-87720.Elqdl9.rst
M Lib/email/_header_value_parser.py
M Lib/test/test_email/test__header_value_parser.py
diff --git a/Lib/email/_header_value_parser.py
b/Lib/email/_header_value_parser.py
index 7c03fb49b3b5e77..f396f4f9b32a9a8 100644
--- a/Lib/email/_header_value_parser.py
+++ b/Lib/email/_header_value_parser.py
@@ -166,6 +166,14 @@ def comments(self):
comments.extend(token.comments)
return comments
+ def contains_token_type(self, *token_types):
+ if self.token_type in token_types:
+ return True
+ for t in self:
+ if t.contains_token_type(*token_types):
+ return True
+ return False
+
def fold(self, *, policy):
return _refold_parse_tree(self, policy=policy)
@@ -933,6 +941,9 @@ def pop_trailing_ws(self):
def comments(self):
return []
+ def contains_token_type(self, *token_types):
+ return self.token_type in token_types
+
def __getnewargs__(self):
return(str(self), self.token_type)
@@ -2916,7 +2927,7 @@ def _refold_with_ew(parse_tree, lines, maxlen, encoding,
*, policy):
continue
tstr = str(part)
if not want_encoding:
- if part.token_type in ('ptext', 'vtext'):
+ if part.token_type == 'ptext' or part.contains_token_type('vtext'):
# Encode if tstr contains special characters.
want_encoding = not SPECIALSNL.isdisjoint(tstr)
else:
diff --git a/Lib/test/test_email/test__header_value_parser.py
b/Lib/test/test_email/test__header_value_parser.py
index 9d9fe418ee4d067..26e9249ba9e948b 100644
--- a/Lib/test/test_email/test__header_value_parser.py
+++ b/Lib/test/test_email/test__header_value_parser.py
@@ -3336,6 +3336,11 @@ def
test_address_list_with_specials_in_encoded_word(self):
'A =?utf-8?q?v=C3=A9ry?= long name\n'
' containing =?utf-8?q?a=2C?= comma\n'
' <[email protected]>\n'),
+ ('=?utf-8?Q?a=2C=20123456789012345678901234567890123456?='
+ ' <[email protected]>',
+ '=?utf-8?q?a=2C?=\n'
+ ' 123456789012345678901234567890123456\n'
+ ' <[email protected]>\n'),
]
for (to, folded) in cases:
with self.subTest(to=to):
diff --git
a/Misc/NEWS.d/next/Library/2026-10-08-16-18-43.gh-issue-87720.Elqdl9.rst
b/Misc/NEWS.d/next/Library/2026-10-08-16-18-43.gh-issue-87720.Elqdl9.rst
new file mode 100644
index 000000000000000..a2df7654b31444b
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2026-10-08-16-18-43.gh-issue-87720.Elqdl9.rst
@@ -0,0 +1,3 @@
+Fixed error in :mod:`email` new policies where header folding failed to
+detect the need to re-quote text obtained from encoded words in certain
+cases.
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]