1616 "Jan" , "Feb" , "Mar" , "Apr" , "May" , "Jun" ,
1717 "Jul" , "Aug" , "Sep" , "Oct" , "Nov" , "Dec" ]
1818
19+ _name_disallowed = re .compile (r'[\x00-\x1F\x7F]' )
20+ _value_disallowed = re .compile (r'[\x00-\x08\x0A-\x1F\x7F]' )
21+
1922def format_date_time (timestamp ):
2023 year , month , day , hh , mm , ss , wd , y , z = time .gmtime (timestamp )
2124 return "%s, %02d %3s %4d %02d:%02d:%02d GMT" % (
@@ -237,13 +240,13 @@ def start_response(self, status, headers,exc_info=None):
237240
238241 self .status = status
239242 self .headers = self .headers_class (headers )
240- status = self ._convert_string_type (status , "Status" )
243+ status = self ._convert_string_type (status , "Status" , name = False )
241244 self ._validate_status (status )
242245
243246 if __debug__ :
244247 for name , val in headers :
245- name = self ._convert_string_type (name , "Header name" )
246- val = self ._convert_string_type (val , "Header value" )
248+ name = self ._convert_string_type (name , "Header name" , name = True )
249+ val = self ._convert_string_type (val , "Header value" , name = False )
247250 assert not is_hop_by_hop (name ),\
248251 f"Hop-by-hop header, '{ name } : { val } ', not allowed"
249252
@@ -257,9 +260,11 @@ def _validate_status(self, status):
257260 if status [3 ] != " " :
258261 raise AssertionError ("Status message must have a space after code" )
259262
260- def _convert_string_type (self , value , title ):
263+ def _convert_string_type (self , value , title , * , name = True ):
261264 """Convert/check value type."""
262265 if type (value ) is str :
266+ if (_name_disallowed if name else _value_disallowed ).search (value ):
267+ raise ValueError ("Control characters not allowed in headers and values" )
263268 return value
264269 raise AssertionError (
265270 "{0} must be of type str (got {1})" .format (title , repr (value ))
0 commit comments