mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +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(): | ||||
|             value = [] | ||||
|             extended = False | ||||
|             # Sort by number | ||||
|             continuations.sort() | ||||
|             # Sort by number, treating None as 0 if there is no 0, | ||||
|             # 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 | ||||
|             # %-encodings for the encoded segments.  If any of the | ||||
|             # 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") | ||||
|         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): | ||||
|         msg = email.message_from_string("From: foo\n") | ||||
|         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)