Issue #1055234: cgi.parse_header(): Fixed parsing of header parameters to

support unusual filenames (such as those containing semi-colons) in
Content-Disposition headers.
This commit is contained in:
Fred Drake 2008-12-04 18:25:17 +00:00
parent ed2f423775
commit 5248103ef9
3 changed files with 45 additions and 3 deletions

View File

@ -289,16 +289,28 @@ def parse_multipart(fp, pdict):
return partdict return partdict
def _parseparam(s):
while s[:1] == ';':
s = s[1:]
end = s.find(';')
while end > 0 and s.count('"', 0, end) % 2:
end = s.find(';', end + 1)
if end < 0:
end = len(s)
f = s[:end]
yield f.strip()
s = s[end:]
def parse_header(line): def parse_header(line):
"""Parse a Content-type like header. """Parse a Content-type like header.
Return the main content-type and a dictionary of options. Return the main content-type and a dictionary of options.
""" """
plist = [x.strip() for x in line.split(';')] parts = _parseparam(';' + line)
key = plist.pop(0).lower() key = parts.next()
pdict = {} pdict = {}
for p in plist: for p in parts:
i = p.find('=') i = p.find('=')
if i >= 0: if i >= 0:
name = p[:i].strip().lower() name = p[:i].strip().lower()

View File

@ -354,6 +354,32 @@ this is the content of the fake file
self.assertEqual([('a', 'A1'), ('b', 'B2'), ('B', 'B3')], self.assertEqual([('a', 'A1'), ('b', 'B2'), ('B', 'B3')],
cgi.parse_qsl('a=A1&b=B2&B=B3')) cgi.parse_qsl('a=A1&b=B2&B=B3'))
def test_parse_header(self):
self.assertEqual(
cgi.parse_header("text/plain"),
("text/plain", {}))
self.assertEqual(
cgi.parse_header("text/vnd.just.made.this.up ; "),
("text/vnd.just.made.this.up", {}))
self.assertEqual(
cgi.parse_header("text/plain;charset=us-ascii"),
("text/plain", {"charset": "us-ascii"}))
self.assertEqual(
cgi.parse_header('text/plain ; charset="us-ascii"'),
("text/plain", {"charset": "us-ascii"}))
self.assertEqual(
cgi.parse_header('text/plain ; charset="us-ascii"; another=opt'),
("text/plain", {"charset": "us-ascii", "another": "opt"}))
self.assertEqual(
cgi.parse_header('attachment; filename="silly.txt"'),
("attachment", {"filename": "silly.txt"}))
self.assertEqual(
cgi.parse_header('attachment; filename="strange;name"'),
("attachment", {"filename": "strange;name"}))
self.assertEqual(
cgi.parse_header('attachment; filename="strange;name";size=123;'),
("attachment", {"filename": "strange;name", "size": "123"}))
def test_main(): def test_main():
run_unittest(CgiTests) run_unittest(CgiTests)

View File

@ -60,6 +60,10 @@ Core and Builtins
Library Library
------- -------
- Issue #1055234: cgi.parse_header(): Fixed parsing of header parameters to
support unusual filenames (such as those containing semi-colons) in
Content-Disposition headers.
- Issue #4384: Added integration with warnings module using captureWarnings(). - Issue #4384: Added integration with warnings module using captureWarnings().
This change includes a NullHandler which does nothing; it will be of use to This change includes a NullHandler which does nothing; it will be of use to
library developers who want to avoid the "No handlers could be found for library developers who want to avoid the "No handlers could be found for