Home / Class/ HttpObjectEncoder Class — netty Architecture

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);
                }
            }

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