Skip to content

Commit 4ca69c3

Browse files
committed
Minor fixes to previous commit
This ensures that duplicate content length headers with a value of b"0" are correctly considered.
1 parent c779540 commit 4ca69c3

File tree

2 files changed

+12
-10
lines changed

2 files changed

+12
-10
lines changed

h11/_headers.py

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ def raw_items(self):
118118

119119
def normalize_and_validate(headers, _parsed=False):
120120
new_headers = []
121-
saw_content_length = None
121+
seen_content_length = None
122122
saw_transfer_encoding = False
123123
for name, value in headers:
124124
# For headers coming out of the parser, we can safely skip some steps,
@@ -133,13 +133,13 @@ def normalize_and_validate(headers, _parsed=False):
133133
name = name.lower()
134134
if name == b"content-length":
135135
validate(_content_length_re, value, "bad Content-Length")
136-
if saw_content_length:
137-
if saw_content_length != value:
136+
if seen_content_length is None:
137+
seen_content_length = value
138+
new_headers.append((raw_name, name, value))
139+
else:
140+
if seen_content_length != value:
138141
raise LocalProtocolError("conflicting Content-Length headers")
139-
# We have a duplicate Content-Length, so collapse it
140-
new_headers.remove((name, saw_content_length))
141-
saw_content_length = value
142-
if name == b"transfer-encoding":
142+
elif name == b"transfer-encoding":
143143
# "A server that receives a request message with a transfer coding
144144
# it does not understand SHOULD respond with 501 (Not
145145
# Implemented)."
@@ -157,7 +157,9 @@ def normalize_and_validate(headers, _parsed=False):
157157
error_status_hint=501,
158158
)
159159
saw_transfer_encoding = True
160-
new_headers.append((raw_name, name, value))
160+
new_headers.append((raw_name, name, value))
161+
else:
162+
new_headers.append((raw_name, name, value))
161163
return Headers(new_headers)
162164

163165

h11/tests/test_headers.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,8 @@ def test_normalize_and_validate():
5555
with pytest.raises(LocalProtocolError):
5656
normalize_and_validate([("Content-Length", "1"), ("Content-Length", "2")])
5757
assert normalize_and_validate(
58-
[("Content-Length", "1"), ("Content-Length", "1")]
59-
) == [(b"content-length", b"1")]
58+
[("Content-Length", "0"), ("Content-Length", "0")]
59+
) == [(b"content-length", b"0")]
6060
with pytest.raises(LocalProtocolError):
6161
normalize_and_validate(
6262
[("Content-Length", "1"), ("Content-Length", "1"), ("Content-Length", "2")]

0 commit comments

Comments
 (0)