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

Appearance settings

Commit afa24d5

Browse filesBrowse 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
Copy full SHA for afa24d5

File tree

Expand file treeCollapse file tree

4 files changed

+28
-1
lines changed
Filter options
Expand file treeCollapse file tree

4 files changed

+28
-1
lines changed

‎Lib/email/feedparser.py

Copy file name to clipboardExpand all lines: Lib/email/feedparser.py
+1-1Lines 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

Copy file name to clipboard
+14Lines 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

Copy file name to clipboardExpand all lines: Lib/test/test_email/test_email.py
+10Lines 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)
+3Lines 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 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.