diff --git a/src/hpack/hpack.py b/src/hpack/hpack.py index 1aff8ab..b7ac760 100644 --- a/src/hpack/hpack.py +++ b/src/hpack/hpack.py @@ -181,8 +181,9 @@ def header_table_size(self) -> int: @header_table_size.setter def header_table_size(self, value: int) -> None: - self.header_table.maxsize = value - if self.header_table.resized: + # 2026-10-11: Preserve an earlier resize until its update is emitted. + if value != self.header_table.maxsize: + self.header_table.maxsize = value self.table_size_changes.append(value) def encode(self, diff --git a/tests/test_hpack.py b/tests/test_hpack.py index e9c170c..1675358 100644 --- a/tests/test_hpack.py +++ b/tests/test_hpack.py @@ -321,6 +321,25 @@ def test_resizing_header_table_to_same_size_ignored(self): out = e.encode(header_set, huffman=True) assert out == b'\x3F\x09\x3F\x45\x3F\x09\x82' + @pytest.mark.parametrize("sizes", [(0,), (128,), (0, 4096)]) + def test_repeated_table_size_preserves_pending_updates(self, sizes): + # 2026-10-11: A no-op assignment must not suppress pending wire updates. + e = Encoder() + d = Decoder() + header_set = [('custom-key', 'custom-value')] + assert d.decode(e.encode(header_set)) == header_set + + for size in sizes: + e.header_table_size = size + e.header_table_size = sizes[-1] + d.max_allowed_table_size = sizes[-1] + + assert d.decode(e.encode([])) == [] + assert d.header_table_size == sizes[-1] + assert list(d.header_table.dynamic_entries) == list(e.header_table.dynamic_entries) + assert d.decode(e.encode(header_set)) == header_set + assert e.encode([(':method', 'GET')]) == b'\x82' + def test_resizing_header_table_sends_context_update(self): e = Encoder()