Home / Class/ Http3ControlStreamInboundHandler Class — netty Architecture

Http3ControlStreamInboundHandler Class — netty Architecture

Architecture documentation for the Http3ControlStreamInboundHandler class in Http3ControlStreamInboundHandler.java from the netty codebase.

Entity Profile

Dependency Diagram

graph TD
  482a62ae_e5d4_afc5_e7a7_ded7c1b1758a["Http3ControlStreamInboundHandler"]
  962d9bec_657d_ee43_1a3c_6ac7f20104fb["Http3ControlStreamInboundHandler.java"]
  482a62ae_e5d4_afc5_e7a7_ded7c1b1758a -->|defined in| 962d9bec_657d_ee43_1a3c_6ac7f20104fb
  f7969e76_5364_d5b3_78bd_74c9a17eddbe["Http3ControlStreamInboundHandler()"]
  482a62ae_e5d4_afc5_e7a7_ded7c1b1758a -->|method| f7969e76_5364_d5b3_78bd_74c9a17eddbe
  24bb57e4_f4a3_573d_cda3_8f432f6ed2d8["isServer()"]
  482a62ae_e5d4_afc5_e7a7_ded7c1b1758a -->|method| 24bb57e4_f4a3_573d_cda3_8f432f6ed2d8
  595c7669_5e01_389a_a265_6538ce4b1079["isGoAwayReceived()"]
  482a62ae_e5d4_afc5_e7a7_ded7c1b1758a -->|method| 595c7669_5e01_389a_a265_6538ce4b1079
  e43433d9_c5c3_3783_799a_e971c51269d9["maxPushIdReceived()"]
  482a62ae_e5d4_afc5_e7a7_ded7c1b1758a -->|method| e43433d9_c5c3_3783_799a_e971c51269d9
  bdb44f5b_93a9_3f66_dff0_5b4f9abcd0ea["forwardControlFrames()"]
  482a62ae_e5d4_afc5_e7a7_ded7c1b1758a -->|method| bdb44f5b_93a9_3f66_dff0_5b4f9abcd0ea
  5bdc0c1e_fda6_8556_2231_2ff645d433c7["handlerAdded()"]
  482a62ae_e5d4_afc5_e7a7_ded7c1b1758a -->|method| 5bdc0c1e_fda6_8556_2231_2ff645d433c7
  3cc0bf8d_689a_4fb1_7166_c2db6dc6df63["readFrameDiscarded()"]
  482a62ae_e5d4_afc5_e7a7_ded7c1b1758a -->|method| 3cc0bf8d_689a_4fb1_7166_c2db6dc6df63
  e1f1a7ae_5b21_5e0c_4d99_5ac309dfe1d9["channelRead()"]
  482a62ae_e5d4_afc5_e7a7_ded7c1b1758a -->|method| e1f1a7ae_5b21_5e0c_4d99_5ac309dfe1d9
  26a29f3a_f6d2_e6f7_bb54_8d431ede4a6e["handleHttp3SettingsFrame()"]
  482a62ae_e5d4_afc5_e7a7_ded7c1b1758a -->|method| 26a29f3a_f6d2_e6f7_bb54_8d431ede4a6e
  b709faf7_6fde_28f8_c2b5_909b643ca464["handleHttp3GoAwayFrame()"]
  482a62ae_e5d4_afc5_e7a7_ded7c1b1758a -->|method| b709faf7_6fde_28f8_c2b5_909b643ca464
  67c08639_8a9a_85b2_08bb_7f127dc08474["handleHttp3MaxPushIdFrame()"]
  482a62ae_e5d4_afc5_e7a7_ded7c1b1758a -->|method| 67c08639_8a9a_85b2_08bb_7f127dc08474
  5245cc82_022f_2aaf_56bb_2cc8275f4a9f["handleHttp3CancelPushFrame()"]
  482a62ae_e5d4_afc5_e7a7_ded7c1b1758a -->|method| 5245cc82_022f_2aaf_56bb_2cc8275f4a9f
  f4e4173c_94c5_9e27_28fd_c10cad2db299["channelReadComplete()"]
  482a62ae_e5d4_afc5_e7a7_ded7c1b1758a -->|method| f4e4173c_94c5_9e27_28fd_c10cad2db299

Relationship Graph

Source Code

codec-http3/src/main/java/io/netty/handler/codec/http3/Http3ControlStreamInboundHandler.java lines 45–321

final class Http3ControlStreamInboundHandler extends Http3FrameTypeInboundValidationHandler<Http3ControlStreamFrame> {
    final boolean server;
    private final ChannelHandler controlFrameHandler;
    private final QpackEncoder qpackEncoder;
    private final Http3ControlStreamOutboundHandler remoteControlStreamHandler;
    private boolean firstFrameRead;
    private Long receivedGoawayId;
    private Long receivedMaxPushId;

    Http3ControlStreamInboundHandler(boolean server, @Nullable ChannelHandler controlFrameHandler,
                                     QpackEncoder qpackEncoder,
                                     Http3ControlStreamOutboundHandler remoteControlStreamHandler) {
        super(Http3ControlStreamFrame.class);
        this.server = server;
        this.controlFrameHandler = controlFrameHandler;
        this.qpackEncoder = qpackEncoder;
        this.remoteControlStreamHandler = remoteControlStreamHandler;
    }

    boolean isServer() {
        return server;
    }

    boolean isGoAwayReceived() {
        return receivedGoawayId != null;
    }

    long maxPushIdReceived() {
        return receivedMaxPushId == null ? -1 : receivedMaxPushId;
    }

    private boolean forwardControlFrames() {
        return controlFrameHandler != null;
    }

    @Override
    public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
        super.handlerAdded(ctx);
        // The user want's to be notified about control frames, add the handler to the pipeline.
        if (controlFrameHandler != null) {
            ctx.pipeline().addLast(controlFrameHandler);
        }
    }

    @Override
    void readFrameDiscarded(ChannelHandlerContext ctx, Object discardedFrame) {
        if (!firstFrameRead && !(discardedFrame instanceof Http3SettingsFrame)) {
            connectionError(ctx, Http3ErrorCode.H3_MISSING_SETTINGS, "Missing settings frame.", forwardControlFrames());
        }
    }

    @Override
    void channelRead(ChannelHandlerContext ctx, Http3ControlStreamFrame frame) throws QpackException {
        boolean isSettingsFrame = frame instanceof Http3SettingsFrame;
        if (!firstFrameRead && !isSettingsFrame) {
            connectionError(ctx, H3_MISSING_SETTINGS, "Missing settings frame.", forwardControlFrames());
            ReferenceCountUtil.release(frame);
            return;
        }
        if (firstFrameRead && isSettingsFrame) {
            connectionError(ctx, H3_FRAME_UNEXPECTED, "Second settings frame received.", forwardControlFrames());
            ReferenceCountUtil.release(frame);
            return;
        }
        firstFrameRead = true;

        final boolean valid;
        if (isSettingsFrame) {
            valid = handleHttp3SettingsFrame(ctx, (Http3SettingsFrame) frame);
        } else if (frame instanceof Http3GoAwayFrame) {
            valid = handleHttp3GoAwayFrame(ctx, (Http3GoAwayFrame) frame);
        } else if (frame instanceof Http3MaxPushIdFrame) {
            valid = handleHttp3MaxPushIdFrame(ctx, (Http3MaxPushIdFrame) frame);
        } else if (frame instanceof Http3CancelPushFrame) {
            valid = handleHttp3CancelPushFrame(ctx, (Http3CancelPushFrame) frame);
        } else {
            // We don't need to do any special handling for Http3UnknownFrames as we either pass these to the next#
            // handler or release these directly.
            assert frame instanceof Http3UnknownFrame;
            valid = true;
        }

Frequently Asked Questions

What is the Http3ControlStreamInboundHandler class?
Http3ControlStreamInboundHandler is a class in the netty codebase, defined in codec-http3/src/main/java/io/netty/handler/codec/http3/Http3ControlStreamInboundHandler.java.
Where is Http3ControlStreamInboundHandler defined?
Http3ControlStreamInboundHandler is defined in codec-http3/src/main/java/io/netty/handler/codec/http3/Http3ControlStreamInboundHandler.java at line 45.

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free