Skip to content

Commit afa24d5

Browse files
[3.11] gh-106186: Don't report MultipartInvariantViolationDefect for valid multipart emails when parsing header only (GH-107016) (#107112)
(cherry picked from commit c65592c) Co-authored-by: htsedebenham <31847376+htsedebenham@users.noreply.github.com>
1 parent d2cdf08 commit afa24d5

File tree

4 files changed

+28
-1
lines changed

4 files changed

+28
-1
lines changed

Lib/email/feedparser.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ def close(self):
189189
assert not self._msgstack
190190
# Look for final set of defects
191191
if root.get_content_maintype() == 'multipart' \
192-
and not root.is_multipart():
192+
and not root.is_multipart() and not self._headersonly:
193193
defect = errors.MultipartInvariantViolationDefect()
194194
self.policy.handle_defect(root, defect)
195195
return root

Lib/test/test_email/data/msg_47.txt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
Date: 01 Jan 2001 00:01+0000
2+
From: arthur@example.example
3+
MIME-Version: 1.0
4+
Content-Type: multipart/mixed; boundary=foo
5+
6+
--foo
7+
Content-Type: text/plain
8+
bar
9+
10+
--foo
11+
Content-Type: text/html
12+
<html><body><p>baz</p></body></html>
13+
14+
--foo--

Lib/test/test_email/test_email.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3696,6 +3696,16 @@ def test_bytes_header_parser(self):
36963696
self.assertIsInstance(msg.get_payload(), str)
36973697
self.assertIsInstance(msg.get_payload(decode=True), bytes)
36983698

3699+
def test_header_parser_multipart_is_valid(self):
3700+
# Don't flag valid multipart emails as having defects
3701+
with openfile('msg_47.txt', encoding="utf-8") as fp:
3702+
msgdata = fp.read()
3703+
3704+
parser = email.parser.Parser(policy=email.policy.default)
3705+
parsed_msg = parser.parsestr(msgdata, headersonly=True)
3706+
3707+
self.assertEqual(parsed_msg.defects, [])
3708+
36993709
def test_bytes_parser_does_not_close_file(self):
37003710
with openfile('msg_02.txt', 'rb') as fp:
37013711
email.parser.BytesParser().parse(fp)
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Do not report ``MultipartInvariantViolationDefect`` defect
2+
when the :class:`email.parser.Parser` class is used
3+
to parse emails with ``headersonly=True``.

0 commit comments

Comments
 (0)