Home / Class/ DeflateDecoder Class — netty Architecture

DeflateDecoder Class — netty Architecture

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

Entity Profile

Dependency Diagram

graph TD
  42259036_5c94_ec21_9d9a_f9cda6ed6e54["DeflateDecoder"]
  245e585d_791f_2180_22d0_325a850f78b8["DeflateDecoder.java"]
  42259036_5c94_ec21_9d9a_f9cda6ed6e54 -->|defined in| 245e585d_791f_2180_22d0_325a850f78b8
  1e732325_97eb_9174_4893_763c72b0238e["DeflateDecoder()"]
  42259036_5c94_ec21_9d9a_f9cda6ed6e54 -->|method| 1e732325_97eb_9174_4893_763c72b0238e
  001d6266_558b_dc78_dc88_64e1f5a72039["WebSocketExtensionFilter()"]
  42259036_5c94_ec21_9d9a_f9cda6ed6e54 -->|method| 001d6266_558b_dc78_dc88_64e1f5a72039
  507ed1f8_ae2a_8bfd_39e5_4457113d2837["appendFrameTail()"]
  42259036_5c94_ec21_9d9a_f9cda6ed6e54 -->|method| 507ed1f8_ae2a_8bfd_39e5_4457113d2837
  62bf3801_45d0_4bd1_bee0_99acc0429aa3["newRsv()"]
  42259036_5c94_ec21_9d9a_f9cda6ed6e54 -->|method| 62bf3801_45d0_4bd1_bee0_99acc0429aa3
  fb637de4_d05f_0309_5edc_a6707ab4cccb["decode()"]
  42259036_5c94_ec21_9d9a_f9cda6ed6e54 -->|method| fb637de4_d05f_0309_5edc_a6707ab4cccb
  54ea9670_933b_21f7_8163_a658686fef33["handlerRemoved()"]
  42259036_5c94_ec21_9d9a_f9cda6ed6e54 -->|method| 54ea9670_933b_21f7_8163_a658686fef33
  22f1dbec_4f45_3332_5439_555608357adf["channelInactive()"]
  42259036_5c94_ec21_9d9a_f9cda6ed6e54 -->|method| 22f1dbec_4f45_3332_5439_555608357adf
  82e2e233_0a09_a0ee_cf5b_f63c2adbdd16["ByteBuf()"]
  42259036_5c94_ec21_9d9a_f9cda6ed6e54 -->|method| 82e2e233_0a09_a0ee_cf5b_f63c2adbdd16
  7f7b9aa8_4ffe_38a1_2a50_c6bab89f05e5["cleanup()"]
  42259036_5c94_ec21_9d9a_f9cda6ed6e54 -->|method| 7f7b9aa8_4ffe_38a1_2a50_c6bab89f05e5

Relationship Graph

Source Code

codec-http/src/main/java/io/netty/handler/codec/http/websocketx/extensions/compression/DeflateDecoder.java lines 42–166

abstract class DeflateDecoder extends WebSocketExtensionDecoder {

    static final ByteBuf FRAME_TAIL = Unpooled.unreleasableBuffer(
            Unpooled.wrappedBuffer(new byte[] {0x00, 0x00, (byte) 0xff, (byte) 0xff}))
            .asReadOnly();

    static final ByteBuf EMPTY_DEFLATE_BLOCK = Unpooled.unreleasableBuffer(
            Unpooled.wrappedBuffer(new byte[] { 0x00 }))
            .asReadOnly();

    private final boolean noContext;
    private final WebSocketExtensionFilter extensionDecoderFilter;
    private final int maxAllocation;

    private EmbeddedChannel decoder;

    /**
     * Constructor
     *
     * @param noContext true to disable context takeover.
     * @param extensionDecoderFilter extension decoder filter.
     */
    DeflateDecoder(boolean noContext, WebSocketExtensionFilter extensionDecoderFilter, int maxAllocation) {
        this.noContext = noContext;
        this.extensionDecoderFilter = checkNotNull(extensionDecoderFilter, "extensionDecoderFilter");
        this.maxAllocation = maxAllocation;
    }

    /**
     * Returns the extension decoder filter.
     */
    protected WebSocketExtensionFilter extensionDecoderFilter() {
        return extensionDecoderFilter;
    }

    protected abstract boolean appendFrameTail(WebSocketFrame msg);

    protected abstract int newRsv(WebSocketFrame msg);

    @Override
    protected void decode(ChannelHandlerContext ctx, WebSocketFrame msg, List<Object> out) throws Exception {
        final ByteBuf decompressedContent = decompressContent(ctx, msg);

        final WebSocketFrame outMsg;
        if (msg instanceof TextWebSocketFrame) {
            outMsg = new TextWebSocketFrame(msg.isFinalFragment(), newRsv(msg), decompressedContent);
        } else if (msg instanceof BinaryWebSocketFrame) {
            outMsg = new BinaryWebSocketFrame(msg.isFinalFragment(), newRsv(msg), decompressedContent);
        } else if (msg instanceof ContinuationWebSocketFrame) {
            outMsg = new ContinuationWebSocketFrame(msg.isFinalFragment(), newRsv(msg), decompressedContent);
        } else {
            throw new CodecException("unexpected frame type: " + msg.getClass().getName());
        }

        out.add(outMsg);
    }

    @Override
    public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
        cleanup();
        super.handlerRemoved(ctx);
    }

    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        cleanup();
        super.channelInactive(ctx);
    }

    private ByteBuf decompressContent(ChannelHandlerContext ctx, WebSocketFrame msg) {
        if (decoder == null) {
            if (!(msg instanceof TextWebSocketFrame) && !(msg instanceof BinaryWebSocketFrame)) {
                throw new CodecException("unexpected initial frame type: " + msg.getClass().getName());
            }
            decoder = EmbeddedChannel.builder()
                    .handlers(ZlibCodecFactory.newZlibDecoder(ZlibWrapper.NONE, maxAllocation))
                    .build();
        }

        boolean readable = msg.content().isReadable();
        boolean emptyDeflateBlock = EMPTY_DEFLATE_BLOCK.equals(msg.content());

Frequently Asked Questions

What is the DeflateDecoder class?
DeflateDecoder is a class in the netty codebase, defined in codec-http/src/main/java/io/netty/handler/codec/http/websocketx/extensions/compression/DeflateDecoder.java.
Where is DeflateDecoder defined?
DeflateDecoder is defined in codec-http/src/main/java/io/netty/handler/codec/http/websocketx/extensions/compression/DeflateDecoder.java at line 42.

Analyze Your Own Codebase

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

Try Supermodel Free