Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[3.11] gh-106186: Don't report MultipartInvariantViolationDefect for valid multipart emails when parsing header only (GH-107016) #107112

Merged
merged 1 commit into from
Jul 23, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion Lib/email/feedparser.py
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,7 @@ def close(self):
assert not self._msgstack
# Look for final set of defects
if root.get_content_maintype() == 'multipart' \
and not root.is_multipart():
and not root.is_multipart() and not self._headersonly:
defect = errors.MultipartInvariantViolationDefect()
self.policy.handle_defect(root, defect)
return root
Expand Down
14 changes: 14 additions & 0 deletions Lib/test/test_email/data/msg_47.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
Date: 01 Jan 2001 00:01+0000
From: arthur@example.example
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=foo

--foo
Content-Type: text/plain
bar

--foo
Content-Type: text/html
<html><body><p>baz</p></body></html>

--foo--
10 changes: 10 additions & 0 deletions Lib/test/test_email/test_email.py
Original file line number Diff line number Diff line change
Expand Up @@ -3696,6 +3696,16 @@ def test_bytes_header_parser(self):
self.assertIsInstance(msg.get_payload(), str)
self.assertIsInstance(msg.get_payload(decode=True), bytes)

def test_header_parser_multipart_is_valid(self):
# Don't flag valid multipart emails as having defects
with openfile('msg_47.txt', encoding="utf-8") as fp:
msgdata = fp.read()

parser = email.parser.Parser(policy=email.policy.default)
parsed_msg = parser.parsestr(msgdata, headersonly=True)

self.assertEqual(parsed_msg.defects, [])

def test_bytes_parser_does_not_close_file(self):
with openfile('msg_02.txt', 'rb') as fp:
email.parser.BytesParser().parse(fp)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Do not report ``MultipartInvariantViolationDefect`` defect
when the :class:`email.parser.Parser` class is used
to parse emails with ``headersonly=True``.