Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions Lib/test/test_wsgiref.py
Original file line number Diff line number Diff line change
Expand Up @@ -592,6 +592,19 @@ def testMappingInterface(self):
self.assertEqual(h["foo"],"baz")
self.assertEqual(h["zoo"],"whee")

def testSetItemValidationFailureKeepsOldValue(self):
# gh-158225: __setitem__ must not delete the old header
# before validating the new name and value.
for bad_value, exc_type in [
("bad\x00value", ValueError),
(123, AssertionError),
]:
with self.subTest(bad_value=bad_value):
h = Headers([("Content-Type", "text/html")])
with self.assertRaises(exc_type):
h["Content-Type"] = bad_value
self.assertEqual(h["Content-Type"], "text/html")

def testRequireList(self):
self.assertRaises(TypeError, Headers, "foo")

Expand Down
7 changes: 4 additions & 3 deletions Lib/wsgiref/headers.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,11 +59,12 @@ def __len__(self):

def __setitem__(self, name, val):
"""Set the value of a header."""
name = self._convert_string_type(name, name=True)
val = self._convert_string_type(val, name=False)
del self[name]
self._headers.append(
(self._convert_string_type(name, name=True), self._convert_string_type(val, name=False)))
self._headers.append((name, val))

def __delitem__(self,name):
def __delitem__(self, name):
"""Delete all occurrences of a header, if present.

Does *not* raise an exception if the header is missing.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Fix :class:`wsgiref.headers.Headers` so that ``__setitem__`` keeps the
existing header value when validation of the new value fails. Patch by
Tony Leung.
Loading