Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit10af840

Browse files
authored
[3.13]gh-135307: Fix email error when policy max_line_length is set to 0 or None (GH-135367) (#140917)
[3.13]gh-135307: Fix email error when policy max_line_length is set to 0 or None (GH-135367)(cherry picked from commit6d45cd8)Co-authored-by: Jiucheng(Oliver) <git.jiucheng@gmail.com>RDM: Like the change made in a earlier PR to the folder, we can/must use 'maxlen' as a stand in for 'unlimited' when computing line lengths when max_line_length is 0 or None; otherwise the computation results in a traceback.
1 parentb8910fc commit10af840

File tree

3 files changed

+35
-5
lines changed

3 files changed

+35
-5
lines changed

‎Lib/email/contentmanager.py‎

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
importemail.charset
33
importemail.message
44
importemail.errors
5+
importsys
56
fromemailimportquoprimime
67

78
classContentManager:
@@ -142,22 +143,23 @@ def _encode_base64(data, max_line_length):
142143

143144

144145
def_encode_text(string,charset,cte,policy):
146+
# If max_line_length is 0 or None, there is no limit.
147+
maxlen=policy.max_line_lengthorsys.maxsize
145148
lines=string.encode(charset).splitlines()
146149
linesep=policy.linesep.encode('ascii')
147150
defembedded_body(lines):returnlinesep.join(lines)+linesep
148151
defnormal_body(lines):returnb'\n'.join(lines)+b'\n'
149152
ifcteisNone:
150153
# Use heuristics to decide on the "best" encoding.
151-
ifmax((len(x)forxinlines),default=0)<=policy.max_line_length:
154+
ifmax(map(len,lines),default=0)<=maxlen:
152155
try:
153156
return'7bit',normal_body(lines).decode('ascii')
154157
exceptUnicodeDecodeError:
155158
pass
156159
ifpolicy.cte_type=='8bit':
157160
return'8bit',normal_body(lines).decode('ascii','surrogateescape')
158161
sniff=embedded_body(lines[:10])
159-
sniff_qp=quoprimime.body_encode(sniff.decode('latin-1'),
160-
policy.max_line_length)
162+
sniff_qp=quoprimime.body_encode(sniff.decode('latin-1'),maxlen)
161163
sniff_base64=binascii.b2a_base64(sniff)
162164
# This is a little unfair to qp; it includes lineseps, base64 doesn't.
163165
iflen(sniff_qp)>len(sniff_base64):
@@ -172,9 +174,9 @@ def normal_body(lines): return b'\n'.join(lines) + b'\n'
172174
data=normal_body(lines).decode('ascii','surrogateescape')
173175
elifcte=='quoted-printable':
174176
data=quoprimime.body_encode(normal_body(lines).decode('latin-1'),
175-
policy.max_line_length)
177+
maxlen)
176178
elifcte=='base64':
177-
data=_encode_base64(embedded_body(lines),policy.max_line_length)
179+
data=_encode_base64(embedded_body(lines),maxlen)
178180
else:
179181
raiseValueError("Unknown content transfer encoding {}".format(cte))
180182
returncte,data

‎Lib/test/test_email/test_message.py‎

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1004,6 +1004,32 @@ def test_folding_with_long_nospace_http_policy_1(self):
10041004
parsed_msg=message_from_bytes(m.as_bytes(),policy=policy.default)
10051005
self.assertEqual(parsed_msg['Message-ID'],m['Message-ID'])
10061006

1007+
deftest_no_wrapping_max_line_length(self):
1008+
# Test that falsey 'max_line_length' are converted to sys.maxsize.
1009+
fornin [0,None]:
1010+
withself.subTest(max_line_length=n):
1011+
self.do_test_no_wrapping_max_line_length(n)
1012+
1013+
defdo_test_no_wrapping_max_line_length(self,falsey):
1014+
self.assertFalse(falsey)
1015+
pol=policy.default.clone(max_line_length=falsey)
1016+
subj="S"*100
1017+
body="B"*100
1018+
msg=EmailMessage(policy=pol)
1019+
msg["From"]="a@ex.com"
1020+
msg["To"]="b@ex.com"
1021+
msg["Subject"]=subj
1022+
msg.set_content(body)
1023+
1024+
raw=msg.as_bytes()
1025+
self.assertNotIn(b"=\n",raw,
1026+
"Found fold indicator; wrapping not disabled")
1027+
1028+
parsed=message_from_bytes(raw,policy=policy.default)
1029+
self.assertEqual(parsed["Subject"],subj)
1030+
parsed_body=parsed.get_body().get_content().rstrip('\n')
1031+
self.assertEqual(parsed_body,body)
1032+
10071033
deftest_get_body_malformed(self):
10081034
"""test for bpo-42892"""
10091035
msg=textwrap.dedent("""\
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
:mod:`email`: Fix exception in ``set_content()`` when encoding text
2+
and max_line_length is set to ``0`` or ``None`` (unlimited).

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp