@@ -464,6 +464,27 @@ def test_get_param_with_quotes(self):
464464 "Content-Type: foo; bar*0=\" baz\\ \" foobar\" ; bar*1=\" \\ \" baz\" " )
465465 self .assertEqual (msg .get_param ('bar' ), 'baz"foobar"baz' )
466466
467+ def test_get_param_linear_complexity (self ):
468+ # Ensure that email.message._parseparam() is fast.
469+ # See https://github.com/python/cpython/issues/136063.
470+ N = 100_000
471+ for s , r in [
472+ ("" , "" ),
473+ ("foo=bar" , "foo=bar" ),
474+ (" FOO = bar " , "foo=bar" ),
475+ ]:
476+ with self .subTest (s = s , r = r , N = N ):
477+ src = f'{ s } ;' * (N - 1 ) + s
478+ res = email .message ._parseparam (src )
479+ self .assertEqual (len (res ), N )
480+ self .assertEqual (len (set (res )), 1 )
481+ self .assertEqual (res [0 ], r )
482+
483+ # This will be considered as a single parameter.
484+ malformed = 's="' + ';' * (N - 1 )
485+ res = email .message ._parseparam (malformed )
486+ self .assertEqual (res , [malformed ])
487+
467488 def test_field_containment (self ):
468489 msg = email .message_from_string ('Header: exists' )
469490 self .assertIn ('header' , msg )
0 commit comments