HttpObjectEncoder Class — netty Architecture
Architecture documentation for the HttpObjectEncoder class in HttpObjectEncoder.java from the netty codebase.
Entity Profile
Dependency Diagram
graph TD 14c61705_9541_276a_37fa_eaab6f15ec5a["HttpObjectEncoder"] 278c7cd5_ffe4_cad2_d250_f2649b7d3014["HttpObjectEncoder.java"] 14c61705_9541_276a_37fa_eaab6f15ec5a -->|defined in| 278c7cd5_ffe4_cad2_d250_f2649b7d3014 3131a977_675c_cce9_b6b8_d3e0f586099a["checkContentState()"] 14c61705_9541_276a_37fa_eaab6f15ec5a -->|method| 3131a977_675c_cce9_b6b8_d3e0f586099a fdc8cfdf_de8c_0056_5e88_e9de76c2f964["HttpObjectEncoder()"] 14c61705_9541_276a_37fa_eaab6f15ec5a -->|method| fdc8cfdf_de8c_0056_5e88_e9de76c2f964 b0ddc820_c1a3_1132_127a_1624788c5f3b["write()"] 14c61705_9541_276a_37fa_eaab6f15ec5a -->|method| b0ddc820_c1a3_1132_127a_1624788c5f3b b4ba8b14_3568_20d5_191d_ee233a07cd22["writeOutList()"] 14c61705_9541_276a_37fa_eaab6f15ec5a -->|method| b4ba8b14_3568_20d5_191d_ee233a07cd22 cdec79dc_4162_729e_d4db_da5c3aef5e7e["writeVoidPromise()"] 14c61705_9541_276a_37fa_eaab6f15ec5a -->|method| cdec79dc_4162_729e_d4db_da5c3aef5e7e be9bcf8f_2c8f_3576_418f_ba8c48a90638["writePromiseCombiner()"] 14c61705_9541_276a_37fa_eaab6f15ec5a -->|method| be9bcf8f_2c8f_3576_418f_ba8c48a90638 18cc7b78_3c6e_f726_9bf6_777174f30988["encode()"] 14c61705_9541_276a_37fa_eaab6f15ec5a -->|method| 18cc7b78_3c6e_f726_9bf6_777174f30988 f4b7407a_0934_4718_fe2e_cb32b6bcf72d["encodeJustHttpMessage()"] 14c61705_9541_276a_37fa_eaab6f15ec5a -->|method| f4b7407a_0934_4718_fe2e_cb32b6bcf72d ebe34bd0_65f8_4408_a145_1b7768631692["encodeByteBufHttpContent()"] 14c61705_9541_276a_37fa_eaab6f15ec5a -->|method| ebe34bd0_65f8_4408_a145_1b7768631692 a61eaa49_0095_25ca_894d_15f990231592["encodeHttpMessageNotLastContent()"] 14c61705_9541_276a_37fa_eaab6f15ec5a -->|method| a61eaa49_0095_25ca_894d_15f990231592 dfbc1010_4c37_d8b8_04e1_8fae7a3f2b99["encodeHttpMessageLastContent()"] 14c61705_9541_276a_37fa_eaab6f15ec5a -->|method| dfbc1010_4c37_d8b8_04e1_8fae7a3f2b99 9ac1b386_8738_51d3_522c_d4e7b37c3049["encodeNotHttpMessageContentTypes()"] 14c61705_9541_276a_37fa_eaab6f15ec5a -->|method| 9ac1b386_8738_51d3_522c_d4e7b37c3049 b7f03547_801e_f8bc_8cf5_573799e43a8c["encodeFullHttpMessage()"] 14c61705_9541_276a_37fa_eaab6f15ec5a -->|method| b7f03547_801e_f8bc_8cf5_573799e43a8c
Relationship Graph
Source Code
codec-http/src/main/java/io/netty/handler/codec/http/HttpObjectEncoder.java lines 55–618
public abstract class HttpObjectEncoder<H extends HttpMessage> extends MessageToMessageEncoder<Object> {
// this is a constant to decide when it is appropriate to copy the data content into the header buffer
private static final int COPY_CONTENT_THRESHOLD = 128;
static final int CRLF_SHORT = (CR << 8) | LF;
private static final int ZERO_CRLF_MEDIUM = ('0' << 16) | CRLF_SHORT;
private static final byte[] ZERO_CRLF_CRLF = { '0', CR, LF, CR, LF };
private static final ByteBuf CRLF_BUF = LeakPresenceDetector.staticInitializer(() -> unreleasableBuffer(
directBuffer(2).writeByte(CR).writeByte(LF)).asReadOnly());
private static final ByteBuf ZERO_CRLF_CRLF_BUF = LeakPresenceDetector.staticInitializer(() -> unreleasableBuffer(
directBuffer(ZERO_CRLF_CRLF.length).writeBytes(ZERO_CRLF_CRLF)).asReadOnly());
private static final float HEADERS_WEIGHT_NEW = 1 / 5f;
private static final float HEADERS_WEIGHT_HISTORICAL = 1 - HEADERS_WEIGHT_NEW;
private static final float TRAILERS_WEIGHT_NEW = HEADERS_WEIGHT_NEW;
private static final float TRAILERS_WEIGHT_HISTORICAL = HEADERS_WEIGHT_HISTORICAL;
private static final int ST_INIT = 0;
private static final int ST_CONTENT_NON_CHUNK = 1;
private static final int ST_CONTENT_CHUNK = 2;
private static final int ST_CONTENT_ALWAYS_EMPTY = 3;
@SuppressWarnings("RedundantFieldInitialization")
private int state = ST_INIT;
/**
* Used to calculate an exponential moving average of the encoded size of the initial line and the headers for
* a guess for future buffer allocations.
*/
private float headersEncodedSizeAccumulator = 256;
/**
* Used to calculate an exponential moving average of the encoded size of the trailers for
* a guess for future buffer allocations.
*/
private float trailersEncodedSizeAccumulator = 256;
private final List<Object> out = new ArrayList<Object>();
private static boolean checkContentState(int state) {
return state == ST_CONTENT_CHUNK || state == ST_CONTENT_NON_CHUNK || state == ST_CONTENT_ALWAYS_EMPTY;
}
public HttpObjectEncoder() {
super(Object.class);
}
@Override
public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
try {
if (acceptOutboundMessage(msg)) {
encode(ctx, msg, out);
if (out.isEmpty()) {
throw new EncoderException(
StringUtil.simpleClassName(this) + " must produce at least one message.");
}
} else {
ctx.write(msg, promise);
}
} catch (EncoderException e) {
throw e;
} catch (Throwable t) {
throw new EncoderException(t);
} finally {
writeOutList(ctx, out, promise);
}
}
private static void writeOutList(ChannelHandlerContext ctx, List<Object> out, ChannelPromise promise) {
final int size = out.size();
try {
if (size == 1) {
ctx.write(out.get(0), promise);
} else if (size > 1) {
// Check if we can use a voidPromise for our extra writes to reduce GC-Pressure
// See https://github.com/netty/netty/issues/2525
if (promise == ctx.voidPromise()) {
writeVoidPromise(ctx, out);
} else {
writePromiseCombiner(ctx, out, promise);
}
}
Source
Frequently Asked Questions
What is the HttpObjectEncoder class?
HttpObjectEncoder is a class in the netty codebase, defined in codec-http/src/main/java/io/netty/handler/codec/http/HttpObjectEncoder.java.
Where is HttpObjectEncoder defined?
HttpObjectEncoder is defined in codec-http/src/main/java/io/netty/handler/codec/http/HttpObjectEncoder.java at line 55.
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free