Skip to content

Commit 63d4df4

Browse files
authored
Merge pull request #3564 from bdarnell/release-654
Cherry-pick case-insensitive `in` fix for release 6.5.4
2 parents 38014dd + eadbf9a commit 63d4df4

File tree

5 files changed

+21
-3
lines changed

5 files changed

+21
-3
lines changed

docs/releases.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ Release notes
44
.. toctree::
55
:maxdepth: 2
66

7+
releases/v6.5.4
78
releases/v6.5.3
89
releases/v6.5.2
910
releases/v6.5.1

docs/releases/v6.5.4.rst

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
What's new in Tornado 6.5.4
2+
===========================
3+
4+
Dec 15, 2025
5+
------------
6+
7+
Bug fixes
8+
~~~~~~~~~
9+
10+
- The ``in`` operator for ``HTTPHeaders`` was incorrectly case-sensitive, causing
11+
lookups to fail for headers with different casing than the original header name.
12+
This was a regression in version 6.5.3 and has been fixed to restore the intended
13+
case-insensitive behavior from version 6.5.2 and earlier.

tornado/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@
2222
# is zero for an official release, positive for a development branch,
2323
# or negative for a release candidate or beta (after the base version
2424
# number has been incremented)
25-
version = "6.5.3"
26-
version_info = (6, 5, 3, 0)
25+
version = "6.5.4"
26+
version_info = (6, 5, 4, 0)
2727

2828
import importlib
2929
import typing

tornado/httputil.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,8 @@ def __contains__(self, name: object) -> bool:
345345
# in __getitem__ when it's not needed.
346346
if not isinstance(name, str):
347347
return False
348-
return name in self._as_list
348+
norm_name = _normalize_header(name)
349+
return norm_name in self._as_list
349350

350351
def __getitem__(self, name: str) -> str:
351352
header = _normalize_header(name)

tornado/test/httputil_test.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,9 @@ def test_multi_line(self):
329329
sorted(list(headers.get_all())),
330330
[("Asdf", "qwer zxcv"), ("Foo", "bar baz"), ("Foo", "even more lines")],
331331
)
332+
# Verify case insensitivity in-operator
333+
self.assertTrue("asdf" in headers)
334+
self.assertTrue("Asdf" in headers)
332335

333336
def test_continuation(self):
334337
data = "Foo: bar\r\n\tasdf"

0 commit comments

Comments
 (0)