summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorThomas Kriechbaumer <Kriechi@users.noreply.github.com>2020-09-06 12:56:48 +0200
committerGitHub <noreply@github.com>2020-09-06 12:56:48 +0200
commitc5d962a14373acf534be620d4e597dfeaff8a2ef (patch)
tree55421c305efd24a6a71ccd1754959c6d2b764382 /src
parente91f2f6eb94b7fb7a12f52fbcce79927308affb8 (diff)
bump hyperframe and fix protocol error (#1238)
Diffstat (limited to 'src')
-rw-r--r--src/h2/connection.py8
-rw-r--r--src/h2/exceptions.py19
-rw-r--r--src/h2/frame_buffer.py26
3 files changed, 20 insertions, 33 deletions
diff --git a/src/h2/connection.py b/src/h2/connection.py
index 7cf451a..aa30711 100644
--- a/src/h2/connection.py
+++ b/src/h2/connection.py
@@ -1721,12 +1721,8 @@ class H2Connection:
"""
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
diff --git a/src/h2/exceptions.py b/src/h2/exceptions.py
index 388f9e9..e22bebc 100644
--- a/src/h2/exceptions.py
+++ b/src/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(ProtocolError):
.. 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(NoSuchStreamError):
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(ProtocolError):
)
-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
diff --git a/src/h2/frame_buffer.py b/src/h2/frame_buffer.py
index 9ca0fe4..785775e 100644
--- a/src/h2/frame_buffer.py
+++ b/src/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:
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:
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.
@@ -152,6 +140,8 @@ class FrameBuffer:
# Try to parse the frame body
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")