@@ -706,6 +706,26 @@ def get(self):
706706 raise
707707
708708
709+ class SetHeaderHandler (RequestHandler ):
710+ def get (self ):
711+ # tests the validity of web.RequestHandler._VALID_HEADER_CHARS
712+ illegal_chars = [chr (o ) for o in range (0 , 0x20 )]
713+ illegal_chars .append (chr (0x7f ))
714+ illegal_chars .remove ('\t ' )
715+ for char in illegal_chars :
716+ try :
717+ self .set_header ("X-Foo" , "foo" + char + "bar" )
718+ raise Exception ("Didn't get expected exception" )
719+ except ValueError as e :
720+ if "Unsafe header value" not in str (e ):
721+ raise
722+
723+ # an empty header value is valid as well
724+ self .set_header ("X-Foo" , "" )
725+
726+ self .finish (b"ok" )
727+
728+
709729class GetArgumentHandler (RequestHandler ):
710730 def prepare (self ):
711731 if self .get_argument ("source" , None ) == "query" :
@@ -790,6 +810,7 @@ def get_handlers(self):
790810 url ("/header_injection" , HeaderInjectionHandler ),
791811 url ("/get_argument" , GetArgumentHandler ),
792812 url ("/get_arguments" , GetArgumentsHandler ),
813+ url ("/set_header" , SetHeaderHandler ),
793814 ]
794815 return urls
795816
@@ -938,6 +959,10 @@ def test_header_injection(self):
938959 response = self .fetch ("/header_injection" )
939960 self .assertEqual (response .body , b"ok" )
940961
962+ def test_set_header (self ):
963+ response = self .fetch ("/set_header" )
964+ self .assertEqual (response .body , b"ok" )
965+
941966 def test_get_argument (self ):
942967 response = self .fetch ("/get_argument?foo=bar" )
943968 self .assertEqual (response .body , b"bar" )
0 commit comments