Fix for SF bug #1072623. When the last line of the input string does not end

in a newline, and it's an end boundary, the FeedParser wasn't recognizing it
as such.  Tweak the regexp to make the ending linesep optional.

For grins, clear self._partial when closing the BufferedSubFile.

Added a test case.
This commit is contained in:
Barry Warsaw 2004-11-28 00:21:42 +00:00
parent f7f9b6cb2d
commit 2e8c1f189a
2 changed files with 16 additions and 1 deletions

View File

@ -62,6 +62,7 @@ class BufferedSubFile(object):
def close(self): def close(self):
# Don't forget any trailing partial line. # Don't forget any trailing partial line.
self._lines.append(self._partial) self._lines.append(self._partial)
self._partial = ''
self._closed = True self._closed = True
def readline(self): def readline(self):
@ -279,7 +280,7 @@ class FeedParser:
separator = '--' + boundary separator = '--' + boundary
boundaryre = re.compile( boundaryre = re.compile(
'(?P<sep>' + re.escape(separator) + '(?P<sep>' + re.escape(separator) +
r')(?P<end>--)?(?P<ws>[ \t]*)(?P<linesep>\r\n|\r|\n)$') r')(?P<end>--)?(?P<ws>[ \t]*)(?P<linesep>\r\n|\r|\n)?$')
capturing_preamble = True capturing_preamble = True
preamble = [] preamble = []
linesep = False linesep = False

View File

@ -1351,6 +1351,20 @@ Content-Type: text/plain
eq(msg.get_boundary(), ' XXXX') eq(msg.get_boundary(), ' XXXX')
eq(len(msg.get_payload()), 2) eq(len(msg.get_payload()), 2)
def test_boundary_without_trailing_newline(self):
m = Parser().parsestr("""\
Content-Type: multipart/mixed; boundary="===============0012394164=="
MIME-Version: 1.0
--===============0012394164==
Content-Type: image/file1.jpg
MIME-Version: 1.0
Content-Transfer-Encoding: base64
YXNkZg==
--===============0012394164==--""")
self.assertEquals(m.get_payload(0).get_payload(), 'YXNkZg==')
# Test some badly formatted messages # Test some badly formatted messages