Hello community, here is the log from the commit of package python-h2 for openSUSE:Factory checked in at 2020-10-29 09:45:06 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-h2 (Old) and /work/SRC/openSUSE:Factory/.python-h2.new.3463 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-h2" Thu Oct 29 09:45:06 2020 rev:11 rq:834647 version:3.2.0 Changes: -------- --- /work/SRC/openSUSE:Factory/python-h2/python-h2.changes 2020-03-27 00:24:01.840218304 +0100 +++ /work/SRC/openSUSE:Factory/.python-h2.new.3463/python-h2.changes 2020-10-29 09:45:09.911990598 +0100 @@ -1,0 +2,5 @@ +Tue Sep 15 13:10:43 UTC 2020 - Marketa Calabkova <mcalabk...@suse.com> + +- Add hyperframe.patch to fix build with hyperframe 6 + +------------------------------------------------------------------- New: ---- hyperframe.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-h2.spec ++++++ --- /var/tmp/diff_new_pack.EzFn1d/_old 2020-10-29 09:45:14.567994996 +0100 +++ /var/tmp/diff_new_pack.EzFn1d/_new 2020-10-29 09:45:14.571995000 +0100 @@ -25,14 +25,16 @@ License: MIT URL: https://github.com/python-hyper/hyper-h2 Source0: https://files.pythonhosted.org/packages/source/h/h2/h2-%{version}.tar.gz +# PATCH-FIX-UPSTREAM https://github.com/python-hyper/hyper-h2/commit/c5d962a14373acf534be620d4e597dfeaff8a2ef bump hyperframe and fix protocol error +Patch0: hyperframe.patch BuildRequires: %{python_module hpack >= 2.3} -BuildRequires: %{python_module hyperframe >= 5.2.0} +BuildRequires: %{python_module hyperframe >= 6.0} BuildRequires: %{python_module hypothesis} BuildRequires: %{python_module pytest} BuildRequires: fdupes BuildRequires: python-rpm-macros Requires: python-hpack >= 2.3 -Requires: python-hyperframe >= 5.2.0 +Requires: python-hyperframe >= 6.0 BuildArch: noarch %if %{with python2} BuildRequires: python-enum34 >= 1.1.6 @@ -50,6 +52,7 @@ %prep %setup -q -n h2-%{version} +%patch0 -p1 %build %python_build ++++++ hyperframe.patch ++++++ >From c5d962a14373acf534be620d4e597dfeaff8a2ef Mon Sep 17 00:00:00 2001 From: Thomas Kriechbaumer <krie...@users.noreply.github.com> Date: Sun, 6 Sep 2020 12:56:48 +0200 Subject: [PATCH] bump hyperframe and fix protocol error (#1238) --- setup.py | 2 +- src/h2/connection.py | 8 ++------ src/h2/exceptions.py | 19 ++++++++++--------- src/h2/frame_buffer.py | 26 ++++++++------------------ test/test_invalid_frame_sequences.py | 2 +- 5 files changed, 22 insertions(+), 35 deletions(-) Index: h2-3.2.0/setup.py =================================================================== --- h2-3.2.0.orig/setup.py +++ h2-3.2.0/setup.py @@ -67,7 +67,7 @@ setup( 'Programming Language :: Python :: Implementation :: PyPy', ], install_requires=[ - 'hyperframe>=5.2.0, <6', + 'hyperframe>=6.0, <7', 'hpack>=3.0,<4', ], extras_require={ Index: h2-3.2.0/h2/connection.py =================================================================== --- h2-3.2.0.orig/h2/connection.py +++ h2-3.2.0/h2/connection.py @@ -1721,12 +1721,8 @@ class H2Connection(object): """ Receive a WINDOW_UPDATE frame on the connection. """ - # Validate the frame. - if not (1 <= frame.window_increment <= self.MAX_WINDOW_INCREMENT): - raise ProtocolError( - "Flow control increment must be between 1 and %d, received %d" - % (self.MAX_WINDOW_INCREMENT, frame.window_increment) - ) + # hyperframe will take care of validating the window_increment. + # If we reach in here, we can assume a valid value. events = self.state_machine.process_input( ConnectionInputs.RECV_WINDOW_UPDATE Index: h2-3.2.0/h2/exceptions.py =================================================================== --- h2-3.2.0.orig/h2/exceptions.py +++ h2-3.2.0/h2/exceptions.py @@ -26,7 +26,7 @@ class FrameTooLargeError(ProtocolError): """ The frame that we tried to send or that we received was too large. """ - #: This error code that corresponds to this kind of Protocol Error. + #: The error code corresponds to this kind of Protocol Error. error_code = h2.errors.ErrorCodes.FRAME_SIZE_ERROR @@ -36,7 +36,7 @@ class FrameDataMissingError(ProtocolErro .. versionadded:: 2.0.0 """ - #: The error code that corresponds to this kind of Protocol Error + #: The error code corresponds to this kind of Protocol Error. error_code = h2.errors.ErrorCodes.FRAME_SIZE_ERROR @@ -52,8 +52,7 @@ class FlowControlError(ProtocolError): """ An attempted action violates flow control constraints. """ - #: The error code that corresponds to this kind of - #: :class:`ProtocolError <h2.exceptions.ProtocolError>` + #: The error code corresponds to this kind of Protocol Error. error_code = h2.errors.ErrorCodes.FLOW_CONTROL_ERROR @@ -94,7 +93,7 @@ class NoSuchStreamError(ProtocolError): <h2.exceptions.ProtocolError>` """ def __init__(self, stream_id): - #: The stream ID that corresponds to the non-existent stream. + #: The stream ID corresponds to the non-existent stream. self.stream_id = stream_id @@ -106,7 +105,7 @@ class StreamClosedError(NoSuchStreamErro stream has been removed. """ def __init__(self, stream_id): - #: The stream ID that corresponds to the nonexistent stream. + #: The stream ID corresponds to the nonexistent stream. self.stream_id = stream_id #: The relevant HTTP/2 error code. @@ -145,13 +144,15 @@ class InvalidBodyLengthError(ProtocolErr ) -class UnsupportedFrameError(ProtocolError, KeyError): +class UnsupportedFrameError(ProtocolError): """ The remote peer sent a frame that is unsupported in this context. .. versionadded:: 2.1.0 + + .. versionchanged:: 4.0.0 + Removed deprecated KeyError parent class. """ - # TODO: Remove the KeyError in 3.0.0 pass @@ -181,6 +182,6 @@ class DenialOfServiceError(ProtocolError .. versionadded:: 2.5.0 """ - #: The error code that corresponds to this kind of + #: The error code corresponds to this kind of #: :class:`ProtocolError <h2.exceptions.ProtocolError>` error_code = h2.errors.ErrorCodes.ENHANCE_YOUR_CALM Index: h2-3.2.0/h2/frame_buffer.py =================================================================== --- h2-3.2.0.orig/h2/frame_buffer.py +++ h2-3.2.0/h2/frame_buffer.py @@ -6,7 +6,7 @@ h2/frame_buffer A data structure that provides a way to iterate over a byte buffer in terms of frames. """ -from hyperframe.exceptions import InvalidFrameError +from hyperframe.exceptions import InvalidFrameError, InvalidDataError from hyperframe.frame import ( Frame, HeadersFrame, ContinuationFrame, PushPromiseFrame ) @@ -57,20 +57,6 @@ class FrameBuffer(object): self.data += data - def _parse_frame_header(self, data): - """ - Parses the frame header from the data. Either returns a tuple of - (frame, length), or throws an exception. The returned frame may be None - if the frame is of unknown type. - """ - try: - frame, length = Frame.parse_frame_header(data[:9]) - except ValueError as e: - # The frame header is invalid. This is a ProtocolError - raise ProtocolError("Invalid frame header received: %s" % str(e)) - - return frame, length - def _validate_frame_length(self, length): """ Confirm that the frame is an appropriate length. @@ -137,9 +123,11 @@ class FrameBuffer(object): raise StopIteration() try: - f, length = self._parse_frame_header(self.data) - except InvalidFrameError: # pragma: no cover - raise ProtocolError("Received frame with invalid frame header.") + f, length = Frame.parse_frame_header(self.data[:9]) + except (InvalidDataError, InvalidFrameError) as e: # pragma: no cover + raise ProtocolError( + "Received frame with invalid header: %s" % str(e) + ) # Next, check that we have enough length to parse the frame body. If # not, bail, leaving the frame header data in the buffer for next time. @@ -154,6 +142,8 @@ class FrameBuffer(object): if f is not None: try: f.parse_body(memoryview(self.data[9:9+length])) + except InvalidDataError: + raise ProtocolError("Received frame with non-compliant data") except InvalidFrameError: raise FrameDataMissingError("Frame data missing or invalid") Index: h2-3.2.0/test/test_invalid_frame_sequences.py =================================================================== --- h2-3.2.0.orig/test/test_invalid_frame_sequences.py +++ h2-3.2.0/test/test_invalid_frame_sequences.py @@ -277,7 +277,7 @@ class TestInvalidFrameSequences(object): with pytest.raises(h2.exceptions.ProtocolError) as e: c.receive_data(frame_data) - assert "Stream ID must be non-zero" in str(e.value) + assert "Received frame with invalid header" in str(e.value) def test_get_stream_reset_event_on_auto_reset(self, frame_factory): """