Commit 5248103e authored by Fred Drake's avatar Fred Drake

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

support unusual filenames (such as those containing semi-colons) in
Content-Disposition headers.
parent ed2f4237
...@@ -289,16 +289,28 @@ def parse_multipart(fp, pdict): ...@@ -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()
......
...@@ -354,6 +354,32 @@ this is the content of the fake 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)
......
...@@ -60,6 +60,10 @@ Core and Builtins ...@@ -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
......
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