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
14 changes: 13 additions & 1 deletion h11/_headers.py
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,19 @@ def __len__(self) -> int:
def __repr__(self) -> str:
return "<Headers(%s)>" % repr(list(self))

def __getitem__(self, idx: int) -> Tuple[bytes, bytes]: # type: ignore[override]
@overload
def __getitem__(self, idx: int) -> Tuple[bytes, bytes]:
...

@overload
def __getitem__(self, idx: slice) -> "Headers":
...

def __getitem__(
self, idx: Union[int, slice]
) -> Union[Tuple[bytes, bytes], "Headers"]:
if isinstance(idx, slice):
return Headers(self._full_items[idx])
_, name, value = self._full_items[idx]
return (name, value)

Expand Down
28 changes: 28 additions & 0 deletions h11/tests/test_headers.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,34 @@
from .._util import LocalProtocolError


@pytest.mark.parametrize(
"index",
[
slice(None, 1),
slice(None, 3),
slice(1, 1),
slice(None, None, -1),
slice(None, None, 2),
],
)
def test_headers_slicing(index: slice) -> None:
headers = Request(
method="GET",
target="/",
headers=[("Host", "example.org"), ("X-First", "one"), ("X-Second", "two")],
).headers
items = list(headers)
raw_items = headers.raw_items()

sliced = headers[index]

assert isinstance(sliced, Headers)
assert list(sliced) == items[index]
assert sliced.raw_items() == raw_items[index]
assert list(headers) == items
assert headers.raw_items() == raw_items


def test_normalize_and_validate() -> None:
assert normalize_and_validate([("foo", "bar")]) == [(b"foo", b"bar")]
assert normalize_and_validate([(b"foo", b"bar")]) == [(b"foo", b"bar")]
Expand Down
1 change: 1 addition & 0 deletions newsfragments/209.bugfix.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Support slicing the header sequence exposed by events, retaining normalized header pairs and original header-name casing.