summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/email/feedparser.py2
-rw-r--r--Lib/test/test_email/data/msg_47.txt14
-rw-r--r--Lib/test/test_email/test_email.py10
-rw-r--r--Misc/NEWS.d/next/Library/2023-07-22-13-09-28.gh-issue-106186.EIsUNG.rst3
4 files changed, 28 insertions, 1 deletions
diff --git a/Lib/email/feedparser.py b/Lib/email/feedparser.py
index 53d71f5..06d6b4a 100644
--- a/Lib/email/feedparser.py
+++ b/Lib/email/feedparser.py
@@ -189,7 +189,7 @@ class FeedParser:
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
diff --git a/Lib/test/test_email/data/msg_47.txt b/Lib/test/test_email/data/msg_47.txt
new file mode 100644
index 0000000..bb48b47
--- /dev/null
+++ b/Lib/test/test_email/data/msg_47.txt
@@ -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-- \ No newline at end of file
diff --git a/Lib/test/test_email/test_email.py b/Lib/test/test_email/test_email.py
index b4f3a24..cdb6ef1 100644
--- a/Lib/test/test_email/test_email.py
+++ b/Lib/test/test_email/test_email.py
@@ -3712,6 +3712,16 @@ class TestParsers(TestEmailBase):
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)
diff --git a/Misc/NEWS.d/next/Library/2023-07-22-13-09-28.gh-issue-106186.EIsUNG.rst b/Misc/NEWS.d/next/Library/2023-07-22-13-09-28.gh-issue-106186.EIsUNG.rst
new file mode 100644
index 0000000..07fdcc9
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2023-07-22-13-09-28.gh-issue-106186.EIsUNG.rst
@@ -0,0 +1,3 @@
+Do not report ``MultipartInvariantViolationDefect`` defect
+when the :class:`email.parser.Parser` class is used
+to parse emails with ``headersonly=True``.