@@ -35,12 +35,14 @@ def __init__(self, headers=None):
3535 self ._headers = headers
3636 if __debug__ :
3737 for k , v in headers :
38- self ._convert_string_type (k )
39- self ._convert_string_type (v )
38+ self ._validate_header_string (k )
39+ self ._validate_header_string (v )
4040
41- def _convert_string_type (self , value ):
42- """Convert/check value type."""
41+ def _validate_header_string (self , value ):
42+ """Validate header type and value ."""
4343 if type (value ) is str :
44+ if '\r ' in value or '\n ' in value :
45+ raise ValueError ('Invalid header name/value: contains CR or LF' )
4446 return value
4547 raise AssertionError ("Header names/values must be"
4648 " of type str (got {0})" .format (repr (value )))
@@ -53,14 +55,15 @@ def __setitem__(self, name, val):
5355 """Set the value of a header."""
5456 del self [name ]
5557 self ._headers .append (
56- (self ._convert_string_type (name ), self ._convert_string_type (val )))
58+ (self ._validate_header_string (name ),
59+ self ._validate_header_string (val )))
5760
5861 def __delitem__ (self ,name ):
5962 """Delete all occurrences of a header, if present.
6063
6164 Does *not* raise an exception if the header is missing.
6265 """
63- name = self ._convert_string_type (name .lower ())
66+ name = self ._validate_header_string (name .lower ())
6467 self ._headers [:] = [kv for kv in self ._headers if kv [0 ].lower () != name ]
6568
6669 def __getitem__ (self ,name ):
@@ -87,13 +90,13 @@ def get_all(self, name):
8790 fields deleted and re-inserted are always appended to the header list.
8891 If no fields exist with the given name, returns an empty list.
8992 """
90- name = self ._convert_string_type (name .lower ())
93+ name = self ._validate_header_string (name .lower ())
9194 return [kv [1 ] for kv in self ._headers if kv [0 ].lower ()== name ]
9295
9396
9497 def get (self ,name ,default = None ):
9598 """Get the first header value for 'name', or return 'default'"""
96- name = self ._convert_string_type (name .lower ())
99+ name = self ._validate_header_string (name .lower ())
97100 for k ,v in self ._headers :
98101 if k .lower ()== name :
99102 return v
@@ -148,8 +151,8 @@ def setdefault(self,name,value):
148151 and value 'value'."""
149152 result = self .get (name )
150153 if result is None :
151- self ._headers .append ((self ._convert_string_type (name ),
152- self ._convert_string_type (value )))
154+ self ._headers .append ((self ._validate_header_string (name ),
155+ self ._validate_header_string (value )))
153156 return value
154157 else :
155158 return result
@@ -172,13 +175,13 @@ def add_header(self, _name, _value, **_params):
172175 """
173176 parts = []
174177 if _value is not None :
175- _value = self ._convert_string_type (_value )
178+ _value = self ._validate_header_string (_value )
176179 parts .append (_value )
177180 for k , v in _params .items ():
178- k = self ._convert_string_type (k )
181+ k = self ._validate_header_string (k )
179182 if v is None :
180183 parts .append (k .replace ('_' , '-' ))
181184 else :
182- v = self ._convert_string_type (v )
185+ v = self ._validate_header_string (v )
183186 parts .append (_formatparam (k .replace ('_' , '-' ), v ))
184- self ._headers .append ((self ._convert_string_type (_name ), "; " .join (parts )))
187+ self ._headers .append ((self ._validate_header_string (_name ), "; " .join (parts )))
0 commit comments