Commit 2e8c1f18 authored by Barry Warsaw's avatar Barry Warsaw

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.
parent f7f9b6cb
...@@ -62,6 +62,7 @@ class BufferedSubFile(object): ...@@ -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: ...@@ -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
......
...@@ -1351,6 +1351,20 @@ Content-Type: text/plain ...@@ -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
......
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