]> granicus.if.org Git - python/commitdiff
Issue #18013: Fix cgi.FieldStorage to parse the W3C sample form.
authorFlorent Xicluna <florent.xicluna@gmail.com>
Sun, 7 Jul 2013 10:44:28 +0000 (12:44 +0200)
committerFlorent Xicluna <florent.xicluna@gmail.com>
Sun, 7 Jul 2013 10:44:28 +0000 (12:44 +0200)
Lib/cgi.py
Lib/test/test_cgi.py
Misc/NEWS

index caa47f80128ae84eb49311fba6496f8757212500..06e03b58588efc36dcf85270ffa993fa6b91f2cf 100755 (executable)
@@ -699,7 +699,7 @@ class FieldStorage:
                          self.encoding, self.errors)
             self.bytes_read += part.bytes_read
             self.list.append(part)
-            if self.bytes_read >= self.length:
+            if part.done or self.bytes_read >= self.length > 0:
                 break
         self.skip_lines()
 
index 0a1e8d388f3748c64ba7bbf41354e7eb9616da4f..d80ec0776787d8cd8c249bdbc6970047557fda87 100644 (file)
@@ -279,6 +279,27 @@ Content-Type: text/plain
         check('x' * (maxline - 1) + '\r')
         check('x' * (maxline - 1) + '\r' + 'y' * (maxline - 1))
 
+    def test_fieldstorage_multipart_w3c(self):
+        # Test basic FieldStorage multipart parsing (W3C sample)
+        env = {
+            'REQUEST_METHOD': 'POST',
+            'CONTENT_TYPE': 'multipart/form-data; boundary={}'.format(BOUNDARY_W3),
+            'CONTENT_LENGTH': str(len(POSTDATA_W3))}
+        fp = BytesIO(POSTDATA_W3.encode('latin-1'))
+        fs = cgi.FieldStorage(fp, environ=env, encoding="latin-1")
+        self.assertEqual(len(fs.list), 2)
+        self.assertEqual(fs.list[0].name, 'submit-name')
+        self.assertEqual(fs.list[0].value, 'Larry')
+        self.assertEqual(fs.list[1].name, 'files')
+        files = fs.list[1].value
+        self.assertEqual(len(files), 2)
+        expect = [{'name': None, 'filename': 'file1.txt', 'value': b'... contents of file1.txt ...'},
+                  {'name': None, 'filename': 'file2.gif', 'value': b'...contents of file2.gif...'}]
+        for x in range(len(files)):
+            for k, exp in expect[x].items():
+                got = getattr(files[x], k)
+                self.assertEqual(got, exp)
+
     _qs_result = {
         'key1': 'value1',
         'key2': ['value2x', 'value2y'],
@@ -428,6 +449,31 @@ Content-Disposition: form-data; name="id"
 -----------------------------721837373350705526688164684
 """
 
+# http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4
+BOUNDARY_W3 = "AaB03x"
+POSTDATA_W3 = """--AaB03x
+Content-Disposition: form-data; name="submit-name"
+
+Larry
+--AaB03x
+Content-Disposition: form-data; name="files"
+Content-Type: multipart/mixed; boundary=BbC04y
+
+--BbC04y
+Content-Disposition: file; filename="file1.txt"
+Content-Type: text/plain
+
+... contents of file1.txt ...
+--BbC04y
+Content-Disposition: file; filename="file2.gif"
+Content-Type: image/gif
+Content-Transfer-Encoding: binary
+
+...contents of file2.gif...
+--BbC04y--
+--AaB03x--
+"""
+
 
 def test_main():
     run_unittest(CgiTests)
index 9ebf5942a7ac9b156af4cfa22041799e0f0e22fc..b0bc75f2989cabe6d32b6eaa4b41e6c108eeb8e3 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -41,6 +41,8 @@ Core and Builtins
 Library
 -------
 
+- Issue #18013: Fix cgi.FieldStorage to parse the W3C sample form.
+
 - Issue #18347: ElementTree's html serializer now preserves the case of
   closing tags.