77"""
88from __future__ import annotations
99
10+ from typing import TYPE_CHECKING
11+
1012from hyperframe .exceptions import InvalidDataError , InvalidFrameError
1113from hyperframe .frame import ContinuationFrame , Frame , HeadersFrame , PushPromiseFrame
1214
1315from .exceptions import FrameDataMissingError , FrameTooLargeError , ProtocolError
1416
17+ if TYPE_CHECKING : # pragma: no cover
18+ from ._typing import Buffer
19+
1520# To avoid a DOS attack based on sending loads of continuation frames, we limit
1621# the maximum number we're prepared to receive. In this case, we'll set the
1722# limit to 64, which means the largest encoded header block we can receive by
@@ -36,25 +41,27 @@ def __init__(self, server: bool = False) -> None:
3641 self ._preamble_len = len (self ._preamble )
3742 self ._headers_buffer : list [HeadersFrame | ContinuationFrame | PushPromiseFrame ] = []
3843
39- def add_data (self , data : bytes ) -> None :
44+ def add_data (self , data : Buffer ) -> None :
4045 """
4146 Add more data to the frame buffer.
4247
4348 :param data: A bytestring containing the byte buffer.
4449 """
50+ data_view = memoryview (data )
51+
4552 if self ._preamble_len :
46- data_len = len (data )
53+ data_len = len (data_view )
4754 of_which_preamble = min (self ._preamble_len , data_len )
4855
49- if self ._preamble [:of_which_preamble ] != data [:of_which_preamble ]:
56+ if self ._preamble [:of_which_preamble ] != data_view [:of_which_preamble ]:
5057 msg = "Invalid HTTP/2 preamble."
5158 raise ProtocolError (msg )
5259
53- data = data [of_which_preamble :]
60+ data_view = data_view [of_which_preamble :]
5461 self ._preamble_len -= of_which_preamble
5562 self ._preamble = self ._preamble [of_which_preamble :]
5663
57- self ._data += data
64+ self ._data += data_view
5865
5966 def _validate_frame_length (self , length : int ) -> None :
6067 """
0 commit comments