@@ -728,6 +728,31 @@ def test_nonascii_add_header_with_tspecial(self):
728728 "attachment; filename*=utf-8''Fu%C3%9Fballer%20%5Bfilename%5D.ppt" ,
729729 msg ['Content-Disposition' ])
730730
731+ def test_invalid_header_names (self ):
732+ invalid_headers = [
733+ ('Invalid Header' , 'contains space' ),
734+ ('Tab\t Header' , 'contains tab' ),
735+ ('Colon:Header' , 'contains colon' ),
736+ ('' , 'Empty name' ),
737+ (' LeadingSpace' , 'starts with space' ),
738+ ('TrailingSpace ' , 'ends with space' ),
739+ ('Header\x7F ' , 'Non-ASCII character' ),
740+ ('Header\x80 ' , 'Extended ASCII' ),
741+ ]
742+ for policy in (email .policy .default , email .policy .compat32 ):
743+ for setter in (Message .__setitem__ , Message .add_header ):
744+ for name , value in invalid_headers :
745+ self .do_test_invalid_header_names (
746+ policy , setter ,name , value )
747+
748+ def do_test_invalid_header_names (self , policy , setter , name , value ):
749+ with self .subTest (policy = policy , setter = setter , name = name , value = value ):
750+ message = Message (policy = policy )
751+ pattern = r'(?i)(?=.*invalid)(?=.*header)(?=.*name)'
752+ with self .assertRaisesRegex (ValueError , pattern ) as cm :
753+ setter (message , name , value )
754+ self .assertIn (f"{ name !r} " , str (cm .exception ))
755+
731756 def test_binary_quopri_payload (self ):
732757 for charset in ('latin-1' , 'ascii' ):
733758 msg = Message ()
0 commit comments