Home / Class/ BrotliDecoder Class — netty Architecture

BrotliDecoder Class — netty Architecture

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

Entity Profile

Dependency Diagram

graph TD
  1ab91a77_63ab_e5b9_9f8e_8e15c08c74e2["BrotliDecoder"]
  0a121b81_03bc_60d8_823c_31cd46cc6e3d["BrotliDecoder.java"]
  1ab91a77_63ab_e5b9_9f8e_8e15c08c74e2 -->|defined in| 0a121b81_03bc_60d8_823c_31cd46cc6e3d
  59c95c1f_2221_3079_7eea_13222910da72["BrotliDecoder()"]
  1ab91a77_63ab_e5b9_9f8e_8e15c08c74e2 -->|method| 59c95c1f_2221_3079_7eea_13222910da72
  637f4f9e_6d96_c331_2d84_0f4d4d324eab["forwardOutput()"]
  1ab91a77_63ab_e5b9_9f8e_8e15c08c74e2 -->|method| 637f4f9e_6d96_c331_2d84_0f4d4d324eab
  f133d60d_f296_abc5_dc2a_aac22a8d324d["State()"]
  1ab91a77_63ab_e5b9_9f8e_8e15c08c74e2 -->|method| f133d60d_f296_abc5_dc2a_aac22a8d324d
  04616cfa_11f1_d045_4bb0_45a17268e4e4["readBytes()"]
  1ab91a77_63ab_e5b9_9f8e_8e15c08c74e2 -->|method| 04616cfa_11f1_d045_4bb0_45a17268e4e4
  4addbdcb_bd51_ae68_28ce_b2c97152c144["handlerAdded()"]
  1ab91a77_63ab_e5b9_9f8e_8e15c08c74e2 -->|method| 4addbdcb_bd51_ae68_28ce_b2c97152c144
  d68fe015_2e70_f3f1_a869_c19569a7aa0e["decode()"]
  1ab91a77_63ab_e5b9_9f8e_8e15c08c74e2 -->|method| d68fe015_2e70_f3f1_a869_c19569a7aa0e
  d6b8ee5c_6a6c_5d81_4de8_0dee3399800a["destroy()"]
  1ab91a77_63ab_e5b9_9f8e_8e15c08c74e2 -->|method| d6b8ee5c_6a6c_5d81_4de8_0dee3399800a
  dbb31225_2500_63ae_0a1f_6ea587259da1["handlerRemoved0()"]
  1ab91a77_63ab_e5b9_9f8e_8e15c08c74e2 -->|method| dbb31225_2500_63ae_0a1f_6ea587259da1
  d675b3c4_e3bc_974b_f7ef_b0162851b371["channelInactive()"]
  1ab91a77_63ab_e5b9_9f8e_8e15c08c74e2 -->|method| d675b3c4_e3bc_974b_f7ef_b0162851b371
  6b2179dc_f429_a31b_7a59_e98ab0cb2023["channelReadComplete()"]
  1ab91a77_63ab_e5b9_9f8e_8e15c08c74e2 -->|method| 6b2179dc_f429_a31b_7a59_e98ab0cb2023

Relationship Graph

Source Code

codec-compression/src/main/java/io/netty/handler/codec/compression/BrotliDecoder.java lines 33–186

public final class BrotliDecoder extends ByteToMessageDecoder {

    private enum State {
        DONE, NEEDS_MORE_INPUT, ERROR
    }

    static {
        try {
            Brotli.ensureAvailability();
        } catch (Throwable throwable) {
            throw new ExceptionInInitializerError(throwable);
        }
    }

    private final int inputBufferSize;
    private DecoderJNI.Wrapper decoder;
    private boolean destroyed;
    private boolean needsRead;

    /**
     * Creates a new BrotliDecoder with a default 8kB input buffer
     */
    public BrotliDecoder() {
        this(8 * 1024);
    }

    /**
     * Creates a new BrotliDecoder
     * @param inputBufferSize desired size of the input buffer in bytes
     */
    public BrotliDecoder(int inputBufferSize) {
        this.inputBufferSize = ObjectUtil.checkPositive(inputBufferSize, "inputBufferSize");
    }

    private void forwardOutput(ChannelHandlerContext ctx) {
        ByteBuffer nativeBuffer = decoder.pull();
        // nativeBuffer actually wraps brotli's internal buffer so we need to copy its content
        ByteBuf copy = ctx.alloc().buffer(nativeBuffer.remaining());
        copy.writeBytes(nativeBuffer);
        needsRead = false;
        ctx.fireChannelRead(copy);
    }

    private State decompress(ChannelHandlerContext ctx, ByteBuf input) {
        for (;;) {
            switch (decoder.getStatus()) {
                case DONE:
                    return State.DONE;

                case OK:
                    decoder.push(0);
                    break;

                case NEEDS_MORE_INPUT:
                    if (decoder.hasOutput()) {
                        forwardOutput(ctx);
                    }

                    if (!input.isReadable()) {
                        return State.NEEDS_MORE_INPUT;
                    }

                    ByteBuffer decoderInputBuffer = decoder.getInputBuffer();
                    decoderInputBuffer.clear();
                    int readBytes = readBytes(input, decoderInputBuffer);
                    decoder.push(readBytes);
                    break;

                case NEEDS_MORE_OUTPUT:
                    forwardOutput(ctx);
                    break;

                default:
                    return State.ERROR;
            }
        }
    }

    private static int readBytes(ByteBuf in, ByteBuffer dest) {
        int limit = Math.min(in.readableBytes(), dest.remaining());
        ByteBuffer slice = dest.slice();

Frequently Asked Questions

What is the BrotliDecoder class?
BrotliDecoder is a class in the netty codebase, defined in codec-compression/src/main/java/io/netty/handler/codec/compression/BrotliDecoder.java.
Where is BrotliDecoder defined?
BrotliDecoder is defined in codec-compression/src/main/java/io/netty/handler/codec/compression/BrotliDecoder.java at line 33.

Analyze Your Own Codebase

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

Try Supermodel Free