Class Http2FrameCodec

  • All Implemented Interfaces:
    io.netty5.channel.ChannelHandler, Http2LifecycleManager

    @UnstableApi
    public class Http2FrameCodec
    extends Http2ConnectionHandler

    This API is very immature. The Http2Connection-based API is currently preferred over this API. This API is targeted to eventually replace or reduce the need for the Http2ConnectionHandler API.

    An HTTP/2 handler that maps HTTP/2 frames to Http2Frame objects and vice versa. For every incoming HTTP/2 frame, an Http2Frame object is created and propagated via ByteToMessageDecoder.channelRead(io.netty5.channel.ChannelHandlerContext, java.lang.Object). Outbound Http2Frame objects received via write(io.netty5.channel.ChannelHandlerContext, java.lang.Object) are converted to the HTTP/2 wire format. HTTP/2 frames specific to a stream implement the Http2StreamFrame interface. The Http2FrameCodec is instantiated using the Http2FrameCodecBuilder. It's recommended for channel handlers to inherit from the Http2ChannelDuplexHandler, as it provides additional functionality like iterating over all active streams or creating outbound streams.

    Stream Lifecycle

    The frame codec delivers and writes frames for active streams. An active stream is closed when either side sends a RST_STREAM frame or both sides send a frame with the END_STREAM flag set. Each Http2StreamFrame has a Http2FrameStream object attached that uniquely identifies a particular stream.

    Http2StreamFrames read from the channel always a Http2FrameStream object set, while when writing a Http2StreamFrame the application code needs to set a Http2FrameStream object using Http2StreamFrame.stream(Http2FrameStream).

    Flow control

    The frame codec automatically increments stream and connection flow control windows.

    Incoming flow controlled frames need to be consumed by writing a Http2WindowUpdateFrame with the consumed number of bytes and the corresponding stream identifier set to the frame codec.

    The local stream-level flow control window can be changed by writing a Http2SettingsFrame with the Http2Settings.initialWindowSize() set to the targeted value.

    The connection-level flow control window can be changed by writing a Http2WindowUpdateFrame with the desired window size increment in bytes and the stream identifier set to 0. By default the initial connection-level flow control window is the same as initial stream-level flow control window.

    New inbound Streams

    The first frame of an HTTP/2 stream must be an Http2HeadersFrame, which will have an Http2FrameStream object attached.

    New outbound Streams

    A outbound HTTP/2 stream can be created by first instantiating a new Http2FrameStream object via Http2ChannelDuplexHandler.newStream(), and then writing a Http2HeadersFrame object with the stream attached.

    {@code
         final Http2Stream2 stream = handler.newStream();
         ctx.write(headersFrame.stream(stream)).addListener(new FutureListener() {
    • Method Detail

      • channelInboundEvent

        public final void channelInboundEvent​(io.netty5.channel.ChannelHandlerContext ctx,
                                              Object evt)
                                       throws Exception
        Handles the cleartext HTTP upgrade event. If an upgrade occurred, sends a simple response via HTTP/2 on stream 1 (the stream specifically reserved for cleartext HTTP upgrade).
        Throws:
        Exception
      • write

        public io.netty5.util.concurrent.Future<Void> write​(io.netty5.channel.ChannelHandlerContext ctx,
                                                            Object msg)
        Processes all Http2Frames. Http2StreamFrames may only originate in child streams.
      • onConnectionError

        protected void onConnectionError​(io.netty5.channel.ChannelHandlerContext ctx,
                                         boolean outbound,
                                         Throwable cause,
                                         Http2Exception http2Ex)
        Description copied from class: Http2ConnectionHandler
        Handler for a connection error. Sends a GO_AWAY frame to the remote endpoint. Once all streams are closed, the connection is shut down.
        Overrides:
        onConnectionError in class Http2ConnectionHandler
        Parameters:
        ctx - the channel context
        outbound - true if the error was caused by an outbound operation.
        cause - the exception that was caught
        http2Ex - the Http2Exception that is embedded in the causality chain. This may be null if it's an unknown exception.
      • onStreamError

        protected final void onStreamError​(io.netty5.channel.ChannelHandlerContext ctx,
                                           boolean outbound,
                                           Throwable cause,
                                           Http2Exception.StreamException streamException)
        Exceptions for unknown streams, that is streams that have no Http2FrameStream object attached are simply logged and replied to by sending a RST_STREAM frame.
        Overrides:
        onStreamError in class Http2ConnectionHandler
        Parameters:
        ctx - the channel context
        outbound - true if the error was caused by an outbound operation.
        cause - the exception that was caught
        streamException - the Http2Exception.StreamException that is embedded in the causality chain.
      • isGracefulShutdownComplete

        protected final boolean isGracefulShutdownComplete()
        Description copied from class: Http2ConnectionHandler
        Called by the graceful shutdown logic to determine when it is safe to close the connection. Returns true if the graceful shutdown has completed and the connection can be safely closed. This implementation just guarantees that there are no active streams. Subclasses may override to provide additional checks.
        Overrides:
        isGracefulShutdownComplete in class Http2ConnectionHandler