diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 5b714617..3db51e69 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -1,3 +1,9 @@ +1.0.6 (2024-05-06) +===================== + +**Changed** +- Further improved the reliability of the qpack encoder/decoder. + 1.0.5 (2024-05-04) ===================== diff --git a/Cargo.lock b/Cargo.lock index 187882d3..38bb7165 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -666,7 +666,7 @@ checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" [[package]] name = "ls-qpack" version = "0.1.4" -source = "git+https://github.com/Ousret/ls-qpack-rs.git#ca1389c62957997a744d03175e9ca7d6d9c97c7f" +source = "git+https://github.com/Ousret/ls-qpack-rs.git#86a836850b45593a1635e757439e291214573828" dependencies = [ "libc", "ls-qpack-sys", @@ -675,7 +675,7 @@ dependencies = [ [[package]] name = "ls-qpack-sys" version = "0.1.4" -source = "git+https://github.com/Ousret/ls-qpack-rs.git#ca1389c62957997a744d03175e9ca7d6d9c97c7f" +source = "git+https://github.com/Ousret/ls-qpack-rs.git#86a836850b45593a1635e757439e291214573828" dependencies = [ "bindgen 0.66.1", "cmake", @@ -1015,7 +1015,7 @@ dependencies = [ [[package]] name = "qh3" -version = "1.0.5" +version = "1.0.6" dependencies = [ "aes", "aws-lc-rs", diff --git a/Cargo.toml b/Cargo.toml index 555730a6..08fb5baf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "qh3" -version = "1.0.5" +version = "1.0.6" edition = "2021" rust-version = "1.75" license = "BSD-3" diff --git a/qh3/__init__.py b/qh3/__init__.py index 6f7e8c88..057a2aae 100644 --- a/qh3/__init__.py +++ b/qh3/__init__.py @@ -11,7 +11,7 @@ from .quic.packet import QuicProtocolVersion from .tls import CipherSuite, SessionTicket -__version__ = "1.0.5" +__version__ = "1.0.6" __all__ = ( "connect", diff --git a/qh3/_hazmat.pyi b/qh3/_hazmat.pyi index 254a2999..1786b779 100644 --- a/qh3/_hazmat.pyi +++ b/qh3/_hazmat.pyi @@ -21,7 +21,9 @@ class QpackDecoder: def feed_header( self, stream_id: int, data: bytes ) -> tuple[bytes, list[tuple[bytes, bytes]]]: ... - def resume_header(self, stream_id: int) -> list[tuple[bytes, bytes]]: ... + def resume_header( + self, stream_id: int + ) -> tuple[bytes, list[tuple[bytes, bytes]]]: ... class QpackEncoder: def apply_settings( diff --git a/qh3/h3/connection.py b/qh3/h3/connection.py index 536f4b31..fa0464a8 100644 --- a/qh3/h3/connection.py +++ b/qh3/h3/connection.py @@ -535,7 +535,8 @@ def _decode_headers(self, stream_id: int, frame_data: Optional[bytes]) -> Header """ try: if frame_data is None: - decoder, headers = b"", self._blocked_stream_map[stream_id]._headers # type: ignore[attr-defined] + decoder, headers = self._blocked_stream_map[stream_id]._pending # type: ignore[attr-defined] + del self._blocked_stream_map[stream_id]._pending # type: ignore[attr-defined] else: # todo: investigate why the underlying implementation # seems to ignore bad frames.. @@ -1059,8 +1060,11 @@ def _receive_stream_data_uni( for blocked_id, blocked_stream in self._blocked_stream_map.items(): try: - headers = self._decoder.resume_header(blocked_id) - blocked_stream._headers = headers + stream_data, headers = self._decoder.resume_header(blocked_id) + blocked_stream._pending = ( + stream_data, + headers, + ) unblocked_streams.add(blocked_id) except StreamBlocked: continue diff --git a/src/headers.rs b/src/headers.rs index 3951facd..34f83bd3 100644 --- a/src/headers.rs +++ b/src/headers.rs @@ -164,7 +164,7 @@ impl QpackDecoder { } } - pub fn resume_header<'a>(&mut self, py: Python<'a>, stream_id: u64) -> PyResult<&'a PyList> { + pub fn resume_header<'a>(&mut self, py: Python<'a>, stream_id: u64) -> PyResult<&'a PyTuple> { let output = self.decoder.unblocked(StreamId::new(stream_id)); if !output.is_some() { @@ -195,7 +195,13 @@ impl QpackDecoder { ); } - return Ok(decoded_headers); + return Ok(PyTuple::new( + py, + [ + PyBytes::new(py, buffer.stream()).to_object(py), + decoded_headers.to_object(py), + ] + )); }, Ok(DecoderOutput::BlockedStream) => { return Err(StreamBlocked::new_err("stream is blocked, need more data to pursue decoding"))