hyperframe is a pure-Python library providing the HTTP/2 framing code used in the hyper project. It allows for creating, serializing, and parsing HTTP/2 frames from a binary stream. The current version is 6.1.0, and it is actively maintained as part of the python-hyper organization.
Install & Compatibility
Where this runs
tested against v6.1.0 · pip install
no network on importno background threads
Install × environment matrix
Each cell = how many times install + import succeeded across repeated harness runs. Partial = flaky.
glibc = Debian/Ubuntu slim · musl = Alpine Linux
muslpy 3.10–3.925 runs
installs and imports cleanly · install 0.0s · import 0.015s · 17.9MB
glibcpy 3.10–3.925 runs
installs and imports cleanly · install 1.5s · import 0.014s · 18MB
16MB installed
● package 16MB
Code
Verified usage
Verified import paths — ran on the pinned version, not inferred.
Frame
✓ from hyperframe.frame import Frame
The primary classes for frames are within the 'hyperframe.frame' submodule.
DataFrame
✓ from hyperframe.frame import DataFrame
Specific frame types like DataFrame are directly importable from 'hyperframe.frame'.
HyperframeError
✓ from hyperframe.exceptions import HyperframeError
Custom exceptions are located in the 'hyperframe.exceptions' submodule.
This example demonstrates creating a `DataFrame`, adding data and flags, serializing it, and then parsing the header and body of a frame from raw bytes. It showcases the basic workflow for working with HTTP/2 frames. Note the use of `memoryview` for efficient binary data handling during parsing.
from hyperframe.frame import DataFrame, Frame
# Create a DATA frame
f = DataFrame(stream_id=5)
f.data = b'some binary data'
f.flags.add('END_STREAM')
f.flags.add('PADDED')
f.padding_length = 30
# Serialize the frame
data = f.serialize()
print(f"Serialized frame: {data.hex()}")
# Parse a frame header from binary data
header_bytes = data[:9] # HTTP/2 frame headers are 9 bytes
parsed_frame_header, length = Frame.parse_frame_header(memoryview(header_bytes))
print(f"Parsed frame type: {type(parsed_frame_header).__name__}, Stream ID: {parsed_frame_header.stream_id}, Length to read: {length}")
# Parse the frame body
body_bytes = data[9:9 + length]
parsed_frame_header.parse_body(memoryview(body_bytes))
print(f"Parsed frame flags: {parsed_frame_header.flags}, Data: {parsed_frame_header.data}")
Errors
Common errors & fixes
ModuleNotFoundError: No module named 'hyperframe'
The 'hyperframe' library is not installed in your Python environment or the environment where your code is being executed.
fixInstall the 'hyperframe' package using pip: `pip install hyperframe`
hyperframe.exceptions.UnknownFrameError
This error occurs when the 'hyperframe' library receives or attempts to parse an HTTP/2 frame with a type byte that it does not recognize, which can happen with custom frames or malformed data.
fixEnsure the input data stream contains valid HTTP/2 frames. If you are intentionally working with extension frames, handle them using `hyperframe.frame.ExtensionFrame` or by passing `strict=False` to parsing functions if applicable, and then inspect the `frame.type` attribute.
hyperframe.exceptions.InvalidPaddingError
This exception is raised when parsing a padded HTTP/2 frame (like DATA, HEADERS, or PUSH_PROMISE) where the padding length specified in the frame header is invalid or exceeds the frame's body length.
fixVerify that the incoming HTTP/2 frame data is correctly formed according to the HTTP/2 specification, especially regarding padding length. If you are creating frames, ensure the `pad_length` (or deprecated `total_padding`) parameter is valid for the frame's body size.
hyperframe.exceptions.InvalidDataError
This error, introduced in hyperframe 6.0.0, indicates that a frame's data content or specific fields violate HTTP/2 specification rules, such as an invalid stream ID for a frame type (e.g., DATA frame with stream ID 0) or malformed SETTINGS/ALTSVC frames.
fixInspect the specific frame and its attributes that triggered the `InvalidDataError`. Correct the stream ID, flag combinations, or data fields to conform to the HTTP/2 specification for that frame type. For example, DATA frames cannot have a stream ID of 0.
Audit
Dependencies
Nonerequiredhyperframe is explicitly designed to have no external dependencies.