Commit f6bcd776 authored by Barry Warsaw's avatar Barry Warsaw

_parsegen(): Move the message/rfc822 clause to after the

message/delivery-status clause, and genericize it to handle all (other)
message/* content types.  This lets us correctly parse 2 more of Anthony's
MIME torture tests (specifically, the message/external-body examples).
parent 39a1c7fe
...@@ -211,21 +211,12 @@ class FeedParser: ...@@ -211,21 +211,12 @@ class FeedParser:
lines.append(line) lines.append(line)
self._cur.set_payload(EMPTYSTRING.join(lines)) self._cur.set_payload(EMPTYSTRING.join(lines))
return return
# So now the input is sitting at the first body line. If the message
# claims to be a message/rfc822 type, then what follows is another RFC
# 2822 message.
if self._cur.get_content_type() == 'message/rfc822':
for retval in self._parsegen():
if retval is NeedMoreData:
yield NeedMoreData
continue
break
self._pop_message()
return
if self._cur.get_content_type() == 'message/delivery-status': if self._cur.get_content_type() == 'message/delivery-status':
# message/delivery-status contains blocks of headers separated by # message/delivery-status contains blocks of headers separated by
# a blank line. We'll represent each header block as a separate # a blank line. We'll represent each header block as a separate
# nested message object. A blank line separates the subparts. # nested message object, but the processing is a bit different
# than standard message/* types because there is no body for the
# nested messages. A blank line separates the subparts.
while True: while True:
self._input.push_eof_matcher(NLCRE.match) self._input.push_eof_matcher(NLCRE.match)
for retval in self._parsegen(): for retval in self._parsegen():
...@@ -249,6 +240,16 @@ class FeedParser: ...@@ -249,6 +240,16 @@ class FeedParser:
# Not at EOF so this is a line we're going to need. # Not at EOF so this is a line we're going to need.
self._input.unreadline(line) self._input.unreadline(line)
return return
if self._cur.get_content_maintype() == 'message':
# The message claims to be a message/* type, then what follows is
# another RFC 2822 message.
for retval in self._parsegen():
if retval is NeedMoreData:
yield NeedMoreData
continue
break
self._pop_message()
return
if self._cur.get_content_maintype() == 'multipart': if self._cur.get_content_maintype() == 'multipart':
boundary = self._cur.get_boundary() boundary = self._cur.get_boundary()
if boundary is None: if boundary is None:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment