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));
}
}
Defined In
Source
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