Home / Class/ Http2StreamFrameToHttpObjectCodec Class — netty Architecture

Http2StreamFrameToHttpObjectCodec Class — netty Architecture

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

Entity Profile

Dependency Diagram

graph TD
  28068ec0_f470_e63a_089d_e0d46f43718e["Http2StreamFrameToHttpObjectCodec"]
  2a2b4e1a_6ea4_6ec4_b48c_45b6dd626bed["Http2StreamFrameToHttpObjectCodec.java"]
  28068ec0_f470_e63a_089d_e0d46f43718e -->|defined in| 2a2b4e1a_6ea4_6ec4_b48c_45b6dd626bed
  b9dc3e71_9ff8_2e25_12ee_25857b5648fa["Http2StreamFrameToHttpObjectCodec()"]
  28068ec0_f470_e63a_089d_e0d46f43718e -->|method| b9dc3e71_9ff8_2e25_12ee_25857b5648fa
  21ea617f_20cc_1b5d_543c_f66cfbbceede["acceptInboundMessage()"]
  28068ec0_f470_e63a_089d_e0d46f43718e -->|method| 21ea617f_20cc_1b5d_543c_f66cfbbceede
  f664b8a7_c178_2d04_e4cb_fdcf0adeceb5["decode()"]
  28068ec0_f470_e63a_089d_e0d46f43718e -->|method| f664b8a7_c178_2d04_e4cb_fdcf0adeceb5
  ca9e54a6_d1a1_f91d_b13a_ec48a0dc7941["encodeLastContent()"]
  28068ec0_f470_e63a_089d_e0d46f43718e -->|method| ca9e54a6_d1a1_f91d_b13a_ec48a0dc7941
  8d983c00_a1f6_85e6_8826_c9bfc2b8c5ac["encode()"]
  28068ec0_f470_e63a_089d_e0d46f43718e -->|method| 8d983c00_a1f6_85e6_8826_c9bfc2b8c5ac
  0ce87881_d97e_7afb_bb83_d6b5cc3780da["Http2Headers()"]
  28068ec0_f470_e63a_089d_e0d46f43718e -->|method| 0ce87881_d97e_7afb_bb83_d6b5cc3780da
  183925d2_947f_540f_5a94_f0feb6e6c406["HttpMessage()"]
  28068ec0_f470_e63a_089d_e0d46f43718e -->|method| 183925d2_947f_540f_5a94_f0feb6e6c406
  cf121762_8e02_73ff_e980_92d5f494f4fb["FullHttpMessage()"]
  28068ec0_f470_e63a_089d_e0d46f43718e -->|method| cf121762_8e02_73ff_e980_92d5f494f4fb
  1ebdff1c_6436_ff9f_3bb8_b8cfedc969d4["handlerAdded()"]
  28068ec0_f470_e63a_089d_e0d46f43718e -->|method| 1ebdff1c_6436_ff9f_3bb8_b8cfedc969d4
  abee8c20_eedf_2afb_eeea_68e7c9dd915b["isSsl()"]
  28068ec0_f470_e63a_089d_e0d46f43718e -->|method| abee8c20_eedf_2afb_eeea_68e7c9dd915b
  c5af41c1_7ec9_ecb8_02bd_08f7c5475267["HttpScheme()"]
  28068ec0_f470_e63a_089d_e0d46f43718e -->|method| c5af41c1_7ec9_ecb8_02bd_08f7c5475267
  7f1a2333_ea20_bf69_5e3e_cc03fbd23341["connectionSchemeAttribute()"]
  28068ec0_f470_e63a_089d_e0d46f43718e -->|method| 7f1a2333_ea20_bf69_5e3e_cc03fbd23341
  65a2b624_5abc_17c8_4a5c_c88931afff9d["Channel()"]
  28068ec0_f470_e63a_089d_e0d46f43718e -->|method| 65a2b624_5abc_17c8_4a5c_c88931afff9d

Relationship Graph

Source Code

codec-http2/src/main/java/io/netty/handler/codec/http2/Http2StreamFrameToHttpObjectCodec.java lines 59–286

@Sharable
public class Http2StreamFrameToHttpObjectCodec extends MessageToMessageCodec<Http2StreamFrame, HttpObject> {

    private static final AttributeKey<HttpScheme> SCHEME_ATTR_KEY =
        AttributeKey.valueOf(HttpScheme.class, "STREAMFRAMECODEC_SCHEME");

    private final boolean isServer;
    private final boolean validateHeaders;

    public Http2StreamFrameToHttpObjectCodec(final boolean isServer,
                                             final boolean validateHeaders) {
        super(Http2StreamFrame.class, HttpObject.class);
        this.isServer = isServer;
        this.validateHeaders = validateHeaders;
    }

    public Http2StreamFrameToHttpObjectCodec(final boolean isServer) {
        this(isServer, true);
    }

    @Override
    public boolean acceptInboundMessage(Object msg) throws Exception {
        return msg instanceof Http2HeadersFrame || msg instanceof Http2DataFrame;
    }

    @Override
    protected void decode(ChannelHandlerContext ctx, Http2StreamFrame frame, List<Object> out) throws Exception {
        if (frame instanceof Http2HeadersFrame) {
            Http2HeadersFrame headersFrame = (Http2HeadersFrame) frame;
            Http2Headers headers = headersFrame.headers();
            Http2FrameStream stream = headersFrame.stream();
            int id = stream == null ? 0 : stream.id();

            final CharSequence status = headers.status();

            // 1xx response (excluding 101) is a special case where Http2HeadersFrame#isEndStream=false
            // but we need to decode it as a FullHttpResponse to play nice with HttpObjectAggregator.
            if (null != status && isInformationalResponseHeaderFrame(status)) {
                final FullHttpMessage fullMsg = newFullMessage(id, headers, ctx.alloc());
                out.add(fullMsg);
                return;
            }

            if (headersFrame.isEndStream()) {
                if (headers.method() == null && status == null) {
                    LastHttpContent last = new DefaultLastHttpContent(Unpooled.EMPTY_BUFFER, validateHeaders);
                    HttpConversionUtil.addHttp2ToHttpHeaders(id, headers, last.trailingHeaders(),
                                                             HttpVersion.HTTP_1_1, true, true);
                    out.add(last);
                } else {
                    FullHttpMessage full = newFullMessage(id, headers, ctx.alloc());
                    out.add(full);
                }
            } else {
                HttpMessage req = newMessage(id, headers);
                if ((status == null || !isContentAlwaysEmpty(status)) && !HttpUtil.isContentLengthSet(req)) {
                    req.headers().add(HttpHeaderNames.TRANSFER_ENCODING, HttpHeaderValues.CHUNKED);
                }
                out.add(req);
            }
        } else if (frame instanceof Http2DataFrame) {
            Http2DataFrame dataFrame = (Http2DataFrame) frame;
            if (dataFrame.isEndStream()) {
                out.add(new DefaultLastHttpContent(dataFrame.content().retain(), validateHeaders));
            } else {
                out.add(new DefaultHttpContent(dataFrame.content().retain()));
            }
        }
    }

    private void encodeLastContent(LastHttpContent last, List<Object> out) {
        boolean needFiller = !(last instanceof FullHttpMessage) && last.trailingHeaders().isEmpty();
        if (last.content().isReadable() || needFiller) {
            out.add(new DefaultHttp2DataFrame(last.content().retain(), last.trailingHeaders().isEmpty()));
        }
        if (!last.trailingHeaders().isEmpty()) {
            Http2Headers headers = HttpConversionUtil.toHttp2Headers(last.trailingHeaders(), validateHeaders);
            out.add(new DefaultHttp2HeadersFrame(headers, true));
        }
    }

Frequently Asked Questions

What is the Http2StreamFrameToHttpObjectCodec class?
Http2StreamFrameToHttpObjectCodec is a class in the netty codebase, defined in codec-http2/src/main/java/io/netty/handler/codec/http2/Http2StreamFrameToHttpObjectCodec.java.
Where is Http2StreamFrameToHttpObjectCodec defined?
Http2StreamFrameToHttpObjectCodec is defined in codec-http2/src/main/java/io/netty/handler/codec/http2/Http2StreamFrameToHttpObjectCodec.java at line 59.

Analyze Your Own Codebase

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

Try Supermodel Free