Skip to content

Commit ccf399d

Browse files
committed
Fix related WSP folding bug
1 parent 45022be commit ccf399d

File tree

4 files changed

+30
-4
lines changed

4 files changed

+30
-4
lines changed

Lib/email/_header_value_parser.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3058,7 +3058,9 @@ def _fold_as_ew(to_encode, lines, maxlen, last_ew, ew_combine_allowed, charset,
30583058
remaining_space = maxlen - len(lines[-1])
30593059
text_space = remaining_space - chrome_len
30603060
if text_space <= 0:
3061-
lines.append(' ')
3061+
newline = _steal_trailing_WSP_if_exists(lines)
3062+
lines.append(newline or ' ')
3063+
new_last_ew = len(lines[-1])
30623064
continue
30633065

30643066
to_encode_word = to_encode[:text_space]

Lib/test/test_email/test_generator.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -413,6 +413,30 @@ def test_defaults_handle_spaces_at_start_of_continuation_line_2(self):
413413
g.flatten(msg)
414414
self.assertEqual(s.getvalue(), expected)
415415

416+
def test_ew_folding_round_trip_1(self):
417+
print()
418+
source = "aaaaaaaaa фффффффф "
419+
msg = EmailMessage()
420+
msg['Subject'] = source
421+
s = io.BytesIO()
422+
g = BytesGenerator(s, maxheaderlen=30)
423+
g.flatten(msg)
424+
flat = s.getvalue()
425+
reparsed = message_from_bytes(flat, policy=policy.default)['Subject']
426+
self.assertMultiLineEqual(reparsed, source)
427+
428+
def test_ew_folding_round_trip_2(self):
429+
print()
430+
source = "aaa aaaaaaa aaa ффф фффф "
431+
msg = EmailMessage()
432+
msg['Subject'] = source
433+
s = io.BytesIO()
434+
g = BytesGenerator(s, maxheaderlen=30)
435+
g.flatten(msg)
436+
flat = s.getvalue()
437+
reparsed = message_from_bytes(flat, policy=policy.default)['Subject']
438+
self.assertMultiLineEqual(reparsed, source)
439+
416440
def test_cte_type_7bit_handles_unknown_8bit(self):
417441
source = ("Subject: Maintenant je vous présente mon "
418442
"collègue\n\n").encode('utf-8')

Lib/test/test_email/test_headerregistry.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1711,7 +1711,7 @@ def test_fold_unstructured_with_overlong_word(self):
17111711
'singlewordthatwontfit')
17121712
self.assertEqual(
17131713
h.fold(policy=policy.default.clone(max_line_length=20)),
1714-
'Subject: \n'
1714+
'Subject:\n'
17151715
' =?utf-8?q?thisisa?=\n'
17161716
' =?utf-8?q?verylon?=\n'
17171717
' =?utf-8?q?glineco?=\n'
@@ -1727,7 +1727,7 @@ def test_fold_unstructured_with_two_overlong_words(self):
17271727
'singlewordthatwontfit plusanotherverylongwordthatwontfit')
17281728
self.assertEqual(
17291729
h.fold(policy=policy.default.clone(max_line_length=20)),
1730-
'Subject: \n'
1730+
'Subject:\n'
17311731
' =?utf-8?q?thisisa?=\n'
17321732
' =?utf-8?q?verylon?=\n'
17331733
' =?utf-8?q?glineco?=\n'

Lib/test/test_email/test_policy.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ def test_non_ascii_chars_do_not_cause_inf_loop(self):
273273
actual = policy.fold('Subject', 'ą' * 12)
274274
self.assertEqual(
275275
actual,
276-
'Subject: \n' +
276+
'Subject:\n' +
277277
12 * ' =?utf-8?q?=C4=85?=\n')
278278

279279
def test_short_maxlen_error(self):

0 commit comments

Comments
 (0)