_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).
This commit is contained in:
parent
c312b07d77
commit
d38f448865
|
@ -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:
|
||||||
# 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:
|
||||||
|
|
Loading…
Reference in New Issue