Skip to content

Commit 26773d6

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

3 files changed

Lines changed: 14 additions & 3 deletions

File tree

‎Lib/test/test_wsgiref.py‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -592,6 +592,14 @@ 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+
h = Headers([("Content-Type", "text/html")])
599+
with self.assertRaises(ValueError):
600+
h["Content-Type"] = "bad\x00value"
601+
self.assertEqual(h["Content-Type"], "text/html")
602+
595603
def testRequireList(self):
596604
self.assertRaises(TypeError, Headers, "foo")
597605

‎Lib/wsgiref/headers.py‎

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,11 @@ 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-
65+
self._headers.append((name, val))
66+
6667
def __delitem__(self,name):
6768
"""Delete all occurrences of a header, if present.
6869
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)