@@ -447,6 +447,27 @@ def test_get_param_with_quotes(self):
447447 "Content-Type: foo; bar*0=\" baz\\ \" foobar\" ; bar*1=\" \\ \" baz\" " )
448448 self .assertEqual (msg .get_param ('bar' ), 'baz"foobar"baz' )
449449
450+ def test_get_param_linear_complexity (self ):
451+ # Ensure that email.message._parseparam() is fast.
452+ # See https://github.com/python/cpython/issues/136063.
453+ N = 100_000
454+ for s , r in [
455+ ("" , "" ),
456+ ("foo=bar" , "foo=bar" ),
457+ (" FOO = bar " , "foo=bar" ),
458+ ]:
459+ with self .subTest (s = s , r = r , N = N ):
460+ src = f'{ s } ;' * (N - 1 ) + s
461+ res = email .message ._parseparam (src )
462+ self .assertEqual (len (res ), N )
463+ self .assertEqual (len (set (res )), 1 )
464+ self .assertEqual (res [0 ], r )
465+
466+ # This will be considered as a single parameter.
467+ malformed = 's="' + ';' * (N - 1 )
468+ res = email .message ._parseparam (malformed )
469+ self .assertEqual (res , [malformed ])
470+
450471 def test_field_containment (self ):
451472 msg = email .message_from_string ('Header: exists' )
452473 self .assertIn ('header' , msg )
0 commit comments