Home / Class/ Http3RequestStreamValidationHandler Class — netty Architecture

Http3RequestStreamValidationHandler Class — netty Architecture

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

Entity Profile

Dependency Diagram

graph TD
  5d15be70_e004_6097_bf4e_460653eef37b["Http3RequestStreamValidationHandler"]
  6c46708e_51ae_378a_5ac7_9fcb4a559f17["Http3RequestStreamValidationHandler.java"]
  5d15be70_e004_6097_bf4e_460653eef37b -->|defined in| 6c46708e_51ae_378a_5ac7_9fcb4a559f17
  d46a8ad6_87e6_2ce8_71a1_2cc0d3f9c264["ChannelHandler()"]
  5d15be70_e004_6097_bf4e_460653eef37b -->|method| d46a8ad6_87e6_2ce8_71a1_2cc0d3f9c264
  028fa4ee_59ff_f2a0_3131_9ebdc96748e0["Http3RequestStreamValidationHandler()"]
  5d15be70_e004_6097_bf4e_460653eef37b -->|method| 028fa4ee_59ff_f2a0_3131_9ebdc96748e0
  e507c4a7_5d91_9296_4892_b3445bfeec41["write()"]
  5d15be70_e004_6097_bf4e_460653eef37b -->|method| e507c4a7_5d91_9296_4892_b3445bfeec41
  7eb82d3c_d46c_48eb_c142_ec762066c3e2["channelRead()"]
  5d15be70_e004_6097_bf4e_460653eef37b -->|method| 7eb82d3c_d46c_48eb_c142_ec762066c3e2
  428ee99c_850f_4b02_96f8_02833d9a8661["userEventTriggered()"]
  5d15be70_e004_6097_bf4e_460653eef37b -->|method| 428ee99c_850f_4b02_96f8_02833d9a8661
  22ba5f14_4d88_a618_2831_fc1b4abef8db["isSharable()"]
  5d15be70_e004_6097_bf4e_460653eef37b -->|method| 22ba5f14_4d88_a618_2831_fc1b4abef8db

Relationship Graph

Source Code

codec-http3/src/main/java/io/netty/handler/codec/http3/Http3RequestStreamValidationHandler.java lines 34–139

final class Http3RequestStreamValidationHandler extends Http3FrameTypeDuplexValidationHandler<Http3RequestStreamFrame> {
    private final boolean server;
    private final BooleanSupplier goAwayReceivedSupplier;
    private final QpackAttributes qpackAttributes;
    private final QpackDecoder qpackDecoder;
    private final Http3RequestStreamCodecState decodeState;
    private final Http3RequestStreamCodecState encodeState;

    private boolean clientHeadRequest;
    private long expectedLength = -1;
    private long seenLength;

    static ChannelHandler newServerValidator(QpackAttributes qpackAttributes, QpackDecoder decoder,
                                             Http3RequestStreamCodecState encodeState,
                                             Http3RequestStreamCodecState decodeState) {
        return new Http3RequestStreamValidationHandler(true, () -> false, qpackAttributes, decoder,
                encodeState, decodeState);
    }

    static ChannelHandler newClientValidator(BooleanSupplier goAwayReceivedSupplier, QpackAttributes qpackAttributes,
                                             QpackDecoder decoder, Http3RequestStreamCodecState encodeState,
                                             Http3RequestStreamCodecState decodeState) {
        return new Http3RequestStreamValidationHandler(false, goAwayReceivedSupplier, qpackAttributes, decoder,
                encodeState, decodeState);
    }

    private Http3RequestStreamValidationHandler(boolean server, BooleanSupplier goAwayReceivedSupplier,
                                                QpackAttributes qpackAttributes, QpackDecoder qpackDecoder,
                                                Http3RequestStreamCodecState encodeState,
                                                Http3RequestStreamCodecState decodeState) {
        super(Http3RequestStreamFrame.class);
        this.server = server;
        this.goAwayReceivedSupplier = goAwayReceivedSupplier;
        this.qpackAttributes = qpackAttributes;
        this.qpackDecoder = qpackDecoder;
        this.decodeState = decodeState;
        this.encodeState = encodeState;
    }

    @Override
    void write(ChannelHandlerContext ctx, Http3RequestStreamFrame frame, ChannelPromise promise) {
        if (!server) {
            if (!validateClientWrite(frame, promise, ctx, goAwayReceivedSupplier, encodeState)) {
                return;
            }
            if (frame instanceof Http3HeadersFrame) {
                clientHeadRequest = HEAD.asciiName().equals(((Http3HeadersFrame) frame).headers().method());
            }
        }
        ctx.write(frame, promise);
    }

    @Override
    void channelRead(ChannelHandlerContext ctx, Http3RequestStreamFrame frame) {
        if (frame instanceof Http3PushPromiseFrame) {
            if (server) {
                // Server should not receive a push promise
                // https://quicwg.org/base-drafts/draft-ietf-quic-http.html#name-push_promise
                frameTypeUnexpected(ctx, frame);
            } else {
                ctx.fireChannelRead(frame);
            }
            return;
        }

        if (frame instanceof Http3HeadersFrame) {
            Http3HeadersFrame headersFrame = (Http3HeadersFrame) frame;
            long maybeContentLength = validateHeaderFrameRead(headersFrame, ctx, decodeState);
            if (maybeContentLength >= 0) {
                expectedLength = maybeContentLength;
            } else if (maybeContentLength == INVALID_FRAME_READ) {
                return;
            }
        }

        if (frame instanceof Http3DataFrame) {
            final Http3DataFrame dataFrame = (Http3DataFrame) frame;
            long maybeContentLength = validateDataFrameRead(dataFrame, ctx, expectedLength, seenLength,
                    clientHeadRequest);
            if (maybeContentLength >= 0) {
                seenLength = maybeContentLength;

Frequently Asked Questions

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

Analyze Your Own Codebase

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

Try Supermodel Free