@@ -481,6 +481,27 @@ def test_get_param_with_quotes(self):
481481 "Content-Type: foo; bar*0=\" baz\\ \" foobar\" ; bar*1=\" \\ \" baz\" " )
482482 self .assertEqual (msg .get_param ('bar' ), 'baz"foobar"baz' )
483483
484+ def test_get_param_linear_complexity (self ):
485+ # Ensure that email.message._parseparam() is fast.
486+ # See https://github.com/python/cpython/issues/136063.
487+ N = 100_000
488+ for s , r in [
489+ ("" , "" ),
490+ ("foo=bar" , "foo=bar" ),
491+ (" FOO = bar " , "foo=bar" ),
492+ ]:
493+ with self .subTest (s = s , r = r , N = N ):
494+ src = f'{ s } ;' * (N - 1 ) + s
495+ res = email .message ._parseparam (src )
496+ self .assertEqual (len (res ), N )
497+ self .assertEqual (len (set (res )), 1 )
498+ self .assertEqual (res [0 ], r )
499+
500+ # This will be considered as a single parameter.
501+ malformed = 's="' + ';' * (N - 1 )
502+ res = email .message ._parseparam (malformed )
503+ self .assertEqual (res , [malformed ])
504+
484505 def test_field_containment (self ):
485506 msg = email .message_from_string ('Header: exists' )
486507 self .assertIn ('header' , msg )
0 commit comments