mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	bpo-34226: fix cgi.parse_multipart without content_length (GH-8530)
In Python 3.7 the behavior of parse_multipart changed requiring CONTENT-LENGTH
header, this fix remove this header as required and fix FieldStorage
read_lines_to_outerboundary, by not using limit when it's negative,
since by default it's -1 if not content-length and keeps substracting what
was read from the file object.
Also added a test case for this problem.
(cherry picked from commit d8cf3514dd)
Co-authored-by: roger <rogerduran@gmail.com>
			
			
This commit is contained in:
		
							parent
							
								
									bab0833d49
								
							
						
					
					
						commit
						b87453f94f
					
				
					 3 changed files with 21 additions and 2 deletions
				
			
		|  | @ -200,7 +200,10 @@ def parse_multipart(fp, pdict, encoding="utf-8", errors="replace"): | |||
|     ctype = "multipart/form-data; boundary={}".format(boundary) | ||||
|     headers = Message() | ||||
|     headers.set_type(ctype) | ||||
|     try: | ||||
|         headers['Content-Length'] = pdict['CONTENT-LENGTH'] | ||||
|     except KeyError: | ||||
|         pass | ||||
|     fs = FieldStorage(fp, headers=headers, encoding=encoding, errors=errors, | ||||
|         environ={'REQUEST_METHOD': 'POST'}) | ||||
|     return {k: fs.getlist(k) for k in fs} | ||||
|  | @ -736,7 +739,8 @@ def read_lines_to_outerboundary(self): | |||
|         last_line_lfend = True | ||||
|         _read = 0 | ||||
|         while 1: | ||||
|             if self.limit is not None and _read >= self.limit: | ||||
| 
 | ||||
|             if self.limit is not None and 0 <= self.limit <= _read: | ||||
|                 break | ||||
|             line = self.fp.readline(1<<16) # bytes | ||||
|             self.bytes_read += len(line) | ||||
|  |  | |||
|  | @ -128,6 +128,20 @@ def test_parse_multipart(self): | |||
|                     'file': [b'Testing 123.\n'], 'title': ['']} | ||||
|         self.assertEqual(result, expected) | ||||
| 
 | ||||
|     def test_parse_multipart_without_content_length(self): | ||||
|         POSTDATA = '''--JfISa01 | ||||
| Content-Disposition: form-data; name="submit-name" | ||||
| 
 | ||||
| just a string | ||||
| 
 | ||||
| --JfISa01-- | ||||
| ''' | ||||
|         fp = BytesIO(POSTDATA.encode('latin1')) | ||||
|         env = {'boundary': 'JfISa01'.encode('latin1')} | ||||
|         result = cgi.parse_multipart(fp, env) | ||||
|         expected = {'submit-name': ['just a string\n']} | ||||
|         self.assertEqual(result, expected) | ||||
| 
 | ||||
|     def test_parse_multipart_invalid_encoding(self): | ||||
|         BOUNDARY = "JfISa01" | ||||
|         POSTDATA = """--JfISa01 | ||||
|  |  | |||
|  | @ -0,0 +1 @@ | |||
| Fix `cgi.parse_multipart` without content_length. Patch by Roger Duran | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Miss Islington (bot)
						Miss Islington (bot)