6262_field_value_re = re .compile (field_value .encode ("ascii" ))
6363
6464
65+ class Headers :
66+ __slots__ = ['raw_items' ]
67+
68+ def __init__ (self , raw_items ):
69+ self .raw_items = raw_items
70+
71+ def __iter__ (self ):
72+ for _ , name , value in self .raw_items :
73+ yield name , value
74+
75+ def __bool__ (self ):
76+ return bool (self .raw_items )
77+
78+ def __eq__ (self , other ):
79+ return list (self ) == list (other )
80+
81+
6582def normalize_and_validate (headers , _parsed = False ):
6683 new_headers = []
6784 saw_content_length = False
@@ -75,6 +92,7 @@ def normalize_and_validate(headers, _parsed=False):
7592 value = bytesify (value )
7693 validate (_field_name_re , name , "Illegal header name {!r}" , name )
7794 validate (_field_value_re , value , "Illegal header value {!r}" , value )
95+ raw_name = name
7896 name = name .lower ()
7997 if name == b"content-length" :
8098 if saw_content_length :
@@ -99,8 +117,8 @@ def normalize_and_validate(headers, _parsed=False):
99117 error_status_hint = 501 ,
100118 )
101119 saw_transfer_encoding = True
102- new_headers .append ((name , value ))
103- return new_headers
120+ new_headers .append ((raw_name , name , value ))
121+ return Headers ( new_headers )
104122
105123
106124def get_comma_header (headers , name ):
@@ -140,7 +158,7 @@ def get_comma_header(headers, name):
140158 # "100-continue". Splitting on commas is harmless. Case insensitive.
141159 #
142160 out = []
143- for found_name , found_raw_value in headers :
161+ for _ , found_name , found_raw_value in headers . raw_items :
144162 if found_name == name :
145163 found_raw_value = found_raw_value .lower ()
146164 for found_split_value in found_raw_value .split (b"," ):
@@ -153,12 +171,12 @@ def get_comma_header(headers, name):
153171def set_comma_header (headers , name , new_values ):
154172 # The header name `name` is expected to be lower-case bytes.
155173 new_headers = []
156- for found_name , found_raw_value in headers :
174+ for found_raw_name , found_name , found_raw_value in headers . raw_items :
157175 if found_name != name :
158- new_headers .append ((found_name , found_raw_value ))
176+ new_headers .append ((found_raw_name , found_raw_value ))
159177 for new_value in new_values :
160178 new_headers .append ((name , new_value ))
161- headers [:] = normalize_and_validate (new_headers )
179+ return normalize_and_validate (new_headers )
162180
163181
164182def has_expect_100_continue (request ):
0 commit comments