diff --git a/src/h2/frame_buffer.py b/src/h2/frame_buffer.py index c2f8a541..e7eaaa57 100644 --- a/src/h2/frame_buffer.py +++ b/src/h2/frame_buffer.py @@ -155,7 +155,7 @@ def __next__(self) -> Frame: # At this point, as we know we'll use or discard the entire frame, we # can update the data. - self._data = self._data[9+length:] + del self._data[:9+length] # Pass the frame through the header buffer. new_frame = self._update_header_buffer(f) diff --git a/tests/test_basic_logic.py b/tests/test_basic_logic.py index 1df989e0..2bef59c4 100644 --- a/tests/test_basic_logic.py +++ b/tests/test_basic_logic.py @@ -23,6 +23,20 @@ from . import helpers +class TestFrameBuffer: + def test_consumed_frames_are_removed_in_place(self) -> None: + frame = hyperframe.frame.SettingsFrame(0).serialize() + buffer = h2.frame_buffer.FrameBuffer() + buffer.max_frame_size = 65535 + buffer.add_data(frame * 2) + data = buffer._data + + next(buffer) + + assert buffer._data is data + assert buffer._data == frame + + class TestBasicClient: """ Basic client-side tests.