Skip to content

Commit 91d9761

Browse files
committed
gh-158225: Fix wsgiref Headers __setitem__ validation order
1 parent 499dff1 commit 91d9761

3 files changed

Lines changed: 19 additions & 3 deletions

File tree

‎Lib/test/test_wsgiref.py‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -592,6 +592,19 @@ def testMappingInterface(self):
592592
self.assertEqual(h["foo"],"baz")
593593
self.assertEqual(h["zoo"],"whee")
594594

595+
def testSetItemValidationFailureKeepsOldValue(self):
596+
# gh-158225: __setitem__ must not delete the old header
597+
# before validating the new name and value.
598+
for bad_value, exc_type in [
599+
("bad\x00value", ValueError),
600+
(123, AssertionError),
601+
]:
602+
with self.subTest(bad_value=bad_value):
603+
h = Headers([("Content-Type", "text/html")])
604+
with self.assertRaises(exc_type):
605+
h["Content-Type"] = bad_value
606+
self.assertEqual(h["Content-Type"], "text/html")
607+
595608
def testRequireList(self):
596609
self.assertRaises(TypeError, Headers, "foo")
597610

‎Lib/wsgiref/headers.py‎

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,12 @@ def __len__(self):
5959

6060
def __setitem__(self, name, val):
6161
"""Set the value of a header."""
62+
name = self._convert_string_type(name, name=True)
63+
val = self._convert_string_type(val, name=False)
6264
del self[name]
63-
self._headers.append(
64-
(self._convert_string_type(name, name=True), self._convert_string_type(val, name=False)))
65+
self._headers.append((name, val))
6566

66-
def __delitem__(self,name):
67+
def __delitem__(self, name):
6768
"""Delete all occurrences of a header, if present.
6869
6970
Does *not* raise an exception if the header is missing.
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Fix :meth:`wsgiref.headers.Headers.__setitem__` to keep the existing
2+
header value when validation of the new value fails. Patch by Tony Leung.

0 commit comments

Comments
 (0)