mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 21:21:22 +00:00 
			
		
		
		
	gh-134151 Fix TypeError in email.utils.decode_params when sorting RFC 2231 continuations (#134687)
				
					
				
			- Fix sorting logic in `email.utils.decode_params` to handle None values. - Update tests for RFC 2231 continuation sorting.
This commit is contained in:
		
							parent
							
								
									d610f11d21
								
							
						
					
					
						commit
						bcb6b45cb8
					
				
					 3 changed files with 28 additions and 2 deletions
				
			
		|  | @ -417,8 +417,14 @@ def decode_params(params): | ||||||
|         for name, continuations in rfc2231_params.items(): |         for name, continuations in rfc2231_params.items(): | ||||||
|             value = [] |             value = [] | ||||||
|             extended = False |             extended = False | ||||||
|             # Sort by number |             # Sort by number, treating None as 0 if there is no 0, | ||||||
|             continuations.sort() |             # and ignore it if there is already a 0. | ||||||
|  |             has_zero = any(x[0] == 0 for x in continuations) | ||||||
|  |             if has_zero: | ||||||
|  |                 continuations = [x for x in continuations if x[0] is not None] | ||||||
|  |             else: | ||||||
|  |                 continuations = [(x[0] or 0, x[1], x[2]) for x in continuations] | ||||||
|  |             continuations.sort(key=lambda x: x[0]) | ||||||
|             # And now append all values in numerical order, converting |             # And now append all values in numerical order, converting | ||||||
|             # %-encodings for the encoded segments.  If any of the |             # %-encodings for the encoded segments.  If any of the | ||||||
|             # continuation names ends in a *, then the entire string, after |             # continuation names ends in a *, then the entire string, after | ||||||
|  |  | ||||||
|  | @ -389,6 +389,24 @@ def test_bad_param(self): | ||||||
|         msg = email.message_from_string("Content-Type: blarg; baz; boo\n") |         msg = email.message_from_string("Content-Type: blarg; baz; boo\n") | ||||||
|         self.assertEqual(msg.get_param('baz'), '') |         self.assertEqual(msg.get_param('baz'), '') | ||||||
| 
 | 
 | ||||||
|  |     def test_continuation_sorting_part_order(self): | ||||||
|  |         msg = email.message_from_string( | ||||||
|  |             "Content-Disposition: attachment; " | ||||||
|  |             "filename*=\"ignored\"; " | ||||||
|  |             "filename*0*=\"utf-8''foo%20\"; " | ||||||
|  |             "filename*1*=\"bar.txt\"\n" | ||||||
|  |         ) | ||||||
|  |         filename = msg.get_filename() | ||||||
|  |         self.assertEqual(filename, 'foo bar.txt') | ||||||
|  | 
 | ||||||
|  |     def test_sorting_no_continuations(self): | ||||||
|  |         msg = email.message_from_string( | ||||||
|  |             "Content-Disposition: attachment; " | ||||||
|  |             "filename*=\"bar.txt\"; " | ||||||
|  |         ) | ||||||
|  |         filename = msg.get_filename() | ||||||
|  |         self.assertEqual(filename, 'bar.txt') | ||||||
|  | 
 | ||||||
|     def test_missing_filename(self): |     def test_missing_filename(self): | ||||||
|         msg = email.message_from_string("From: foo\n") |         msg = email.message_from_string("From: foo\n") | ||||||
|         self.assertEqual(msg.get_filename(), None) |         self.assertEqual(msg.get_filename(), None) | ||||||
|  |  | ||||||
|  | @ -0,0 +1,2 @@ | ||||||
|  | :mod:`email`: Fix :exc:`TypeError` in :func:`email.utils.decode_params` | ||||||
|  | when sorting :rfc:`2231` continuations that contain an unnumbered section. | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Jiucheng(Oliver)
						Jiucheng(Oliver)