- Decode and discard
HEADERSreceived for a locally-initiated stream which was already reset, e.g. a response in flight when the request was cancelled, rather than failing the connection withProtocolError. This keeps the HPACK decoder state synchronized with the remote peer (RFC 9113 §5.1). CONTINUATIONframes generated when packing a large header block now carry the stream ID of the frame they continue.
- Treat
RST_STREAM(NO_ERROR)as an orderly stream closure rather than constructing aStreamError.
- On a graceful
GOAWAY(error code0), keep the connection open until the streams the remote peer accepted have completed, instead of closing it immediately and failing those requests withEOFError. Connection#create_streamrefuses to open a locally-initiated stream once aGOAWAYhas been received, as required by RFC 9113 §6.8.
- Ignore the reserved high bit when decoding GOAWAY last stream IDs.
- Improve
StreamErrormessages for HTTP/2 stream reset error codes.
- On RST_STREAM with REFUSED_STREAM, close the stream with
Protocol::HTTP::RefusedErrorinstead ofStreamError.
- On GOAWAY, proactively close unprocessed streams (ID above
last_stream_id) withProtocol::HTTP::RequestRefusedError, enabling safe retry of non-idempotent requests.
- When closing a connection with active streams, if an error is not provided, it will default to
EOFErrorso that streams propagate the closure correctly.
- Introduce a limit to the number of CONTINUATION frames that can be read to prevent resource exhaustion. The default limit is 8 continuation frames, which means a total of 9 frames (1 initial + 8 continuation). This limit can be adjusted by passing a different value to the
limitparameter in theContinued.readmethod. Setting the limit to 0 will only read the initial frame without any continuation frames. In order to change the default, you can redefine theLIMITconstant in theProtocol::HTTP2::Continuedmodule, OR you can pass a different frame class to the framer.
- Improved tracing performance by only tracing framer operations when in an active trace context.
- Updated
protocol-httpdependency version in gemspec. - Code modernization and documentation improvements.
HTTP/2 has deprecated the priority frame and stream dependency tracking. This feature has been effectively removed from the protocol. As a consequence, the internal implementation is greatly simplified. The Protocol::HTTP2::Stream class no longer tracks dependencies, and this includes Stream#send_headers which no longer takes priority as the first argument.
Optional per-request priority can be set using the priority header instead, and this value can be manipulated using the priority update frame.
- Breaking: Removed support for priority frame and stream dependencies. The
Protocol::HTTP2::Streamclass no longer tracks dependencies, andStream#send_headersno longer takespriorityas the first argument. This change simplifies the internal implementation significantly as HTTP/2 priority frames have been deprecated in the protocol specification.
- Improved performance of dependency management by avoiding linear search operations.
- Removed
tracesas a required dependency - it's now optional and only used when explicitly needed. - Added better documentation for
maximum_concurrent_streamssetting. - Restored 100% test coverage and exposed trace provider for optional tracing support.
- Reduced the number of window update frames sent to improve network efficiency.
- Improved window update frame handling and performance optimizations.
- Better implementation of
Window#inspectfor debugging.
- Added traces to framer for better debugging and monitoring capabilities.
- Minor fixes to logging output.
- Performance improvements for synchronized output handling.
- Extracted
window.rbinto separate module for better organization.
- Removed unused
openedhook that was never utilized. - Improved ASCII art diagram in documentation.
- Modernized gem structure and dependencies.
- Moved test fixtures into proper namespace organization.
- Fixed
maximum_connection_streamsreference to use@remote_settings. - Modernized gem structure and dependencies.
- Improved flush synchronization -
#flushis already synchronized.
- Exposed synchronize flush functionality for better concurrency control.
- Improved single line responsibility in code structure.
- Enhanced error handling - fail in
Connection#write_framesif@framerisnil. - Fixed broken test cases.
- Removed unused
bake-github-pagesgem dependency. - Modernized gem structure and build process.
- Updated development dependencies and workflows.
- Achieved 100% test coverage with comprehensive test improvements.
- Fixed multiple minor bugs discovered through enhanced testing.
- Modernized gem structure and development workflow.
- Improved maximum concurrent stream handling - now defined only by local settings.
- Added missing require statements in version tests.
- Added fuzzing support for the framer to improve robustness.
- Improved connection closed state determination.
- Enhanced error handling by ignoring expected errors.
- Optimized AFL (American Fuzzy Lop) latency handling.
- Added methods for handling state transitions.
- Removed
pryandrakedependencies for cleaner gem structure. - Improved debugging and development workflow.
- Updated supported Ruby versions.
- Significantly improved flow control handling, allowing connection local window to have desired high water mark.
- Enhanced window management for better performance.
- Separated stream and priority logic to improve memory efficiency.
- Added Ruby 2.7 support to continuous integration.
- Improved code organization and performance.
- Improved child stream handling - don't consider child in future stream priority computations.
- Enhanced state transitions to cache number of currently active streams.
- Performance optimizations for stream management.
- Split window handling for sub-classes to improve modularity.
- Fixed Travis CI badge in documentation.
- Enhanced window management architecture.
- Added support for synchronizing output to prevent headers from being encoded out of order.
- Improved header handling reliability and consistency.
- Introduced explicit
StreamErrorfor stream reset codes. - Added
HeaderErrorfor tracking header-specific problems (e.g., invalid pseudo-headers). - Removed
send_failuremethod as it was not useful. - Improved
header_table_sizehandling. - Enhanced stream priority handling and parent/child relationships.
- Better flow control and priority management.
- Improved debugging output and error validation.
- Enhanced handling of
end_streamand connection management. - Added stream buffer implementation with window update integration.
- Implemented basic stream priority handling.
- Improved goaway frame handling.
- Better handling of GOAWAY frames.
- Improved connection termination procedures.
- Improved handling of stream creation and push promises.
- Enhanced stream lifecycle management.
- Improved validation of stream ID and error handling.
- Enhanced flow control implementation.
- Better RFC compliance with HTTP/2 specification.
- Fixed priority frame validation - fail if priority depends on own stream.
- Improved ping frame length checking.
- Enhanced logging messages and error reporting.
- Added support for
ENABLE_CONNECT_PROTOCOLsetting. - Better handling of underlying IO being closed.
- Improved connection management and error handling.
- Enhanced coverage reporting.
- Fixed header length and EOF handling.
- Improved error boundary conditions.
- Significantly improved error handling throughout the library.
- Better exception management and error reporting.
- Fixed HPACK usage and integration.
- Corrected header compression/decompression handling.
- Initial migration of HTTP/2 protocol implementation from
http-protocol. - Basic HTTP/2 frame parsing and generation.
- Integration with
protocol-hpackfor header compression. - Stream management and flow control foundation.
- Connection lifecycle management.
- Support for all standard HTTP/2 frame types.
- Basic client and server implementations.