Home / Class/ DeflateEncoder Class — netty Architecture

DeflateEncoder Class — netty Architecture

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

Entity Profile

Dependency Diagram

graph TD
  3e2d1413_1ae5_e37c_290b_57bfb2bcef3b["DeflateEncoder"]
  29ec22bc_6790_b5e6_9fb9_17f1e4c04901["DeflateEncoder.java"]
  3e2d1413_1ae5_e37c_290b_57bfb2bcef3b -->|defined in| 29ec22bc_6790_b5e6_9fb9_17f1e4c04901
  1219c019_8461_8eff_b573_46486ddeb031["DeflateEncoder()"]
  3e2d1413_1ae5_e37c_290b_57bfb2bcef3b -->|method| 1219c019_8461_8eff_b573_46486ddeb031
  46361d11_83a3_62c3_6000_f3c54c59a185["WebSocketExtensionFilter()"]
  3e2d1413_1ae5_e37c_290b_57bfb2bcef3b -->|method| 46361d11_83a3_62c3_6000_f3c54c59a185
  bb225e07_e5ba_a989_94c1_9124f03babdb["rsv()"]
  3e2d1413_1ae5_e37c_290b_57bfb2bcef3b -->|method| bb225e07_e5ba_a989_94c1_9124f03babdb
  c9f595db_eee6_5a26_839f_89649b69e378["removeFrameTail()"]
  3e2d1413_1ae5_e37c_290b_57bfb2bcef3b -->|method| c9f595db_eee6_5a26_839f_89649b69e378
  4584d63c_2bfa_360c_1fe1_572d00814f47["encode()"]
  3e2d1413_1ae5_e37c_290b_57bfb2bcef3b -->|method| 4584d63c_2bfa_360c_1fe1_572d00814f47
  c76df0b0_aebe_148b_20b7_0aa71dd53dfc["handlerRemoved()"]
  3e2d1413_1ae5_e37c_290b_57bfb2bcef3b -->|method| c76df0b0_aebe_148b_20b7_0aa71dd53dfc
  8d7d3ab9_dfc3_34dd_a261_4cec62c8a737["ByteBuf()"]
  3e2d1413_1ae5_e37c_290b_57bfb2bcef3b -->|method| 8d7d3ab9_dfc3_34dd_a261_4cec62c8a737
  26a67d80_d395_9e0d_89dd_ee6bdf9c7f91["cleanup()"]
  3e2d1413_1ae5_e37c_290b_57bfb2bcef3b -->|method| 26a67d80_d395_9e0d_89dd_ee6bdf9c7f91

Relationship Graph

Source Code

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

abstract class DeflateEncoder extends WebSocketExtensionEncoder {

    private final int compressionLevel;
    private final int windowSize;
    private final boolean noContext;
    private final WebSocketExtensionFilter extensionEncoderFilter;

    private EmbeddedChannel encoder;

    /**
     * Constructor
     * @param compressionLevel compression level of the compressor.
     * @param windowSize maximum size of the window compressor buffer.
     * @param noContext true to disable context takeover.
     * @param extensionEncoderFilter extension encoder filter.
     */
    DeflateEncoder(int compressionLevel, int windowSize, boolean noContext,
                   WebSocketExtensionFilter extensionEncoderFilter) {
        this.compressionLevel = compressionLevel;
        this.windowSize = windowSize;
        this.noContext = noContext;
        this.extensionEncoderFilter = checkNotNull(extensionEncoderFilter, "extensionEncoderFilter");
    }

    /**
     * Returns the extension encoder filter.
     */
    protected WebSocketExtensionFilter extensionEncoderFilter() {
        return extensionEncoderFilter;
    }

    /**
     * @param msg the current frame.
     * @return the rsv bits to set in the compressed frame.
     */
    protected abstract int rsv(WebSocketFrame msg);

    /**
     * @param msg the current frame.
     * @return true if compressed payload tail needs to be removed.
     */
    protected abstract boolean removeFrameTail(WebSocketFrame msg);

    @Override
    protected void encode(ChannelHandlerContext ctx, WebSocketFrame msg, List<Object> out) throws Exception {
        final ByteBuf compressedContent;
        if (msg.content().isReadable()) {
            compressedContent = compressContent(ctx, msg);
        } else if (msg.isFinalFragment()) {
            // Set empty DEFLATE block manually for unknown buffer size
            // https://tools.ietf.org/html/rfc7692#section-7.2.3.6
            compressedContent = EMPTY_DEFLATE_BLOCK.duplicate();
        } else {
            throw new CodecException("cannot compress content buffer");
        }

        final WebSocketFrame outMsg;
        if (msg instanceof TextWebSocketFrame) {
            outMsg = new TextWebSocketFrame(msg.isFinalFragment(), rsv(msg), compressedContent);
        } else if (msg instanceof BinaryWebSocketFrame) {
            outMsg = new BinaryWebSocketFrame(msg.isFinalFragment(), rsv(msg), compressedContent);
        } else if (msg instanceof ContinuationWebSocketFrame) {
            outMsg = new ContinuationWebSocketFrame(msg.isFinalFragment(), rsv(msg), compressedContent);
        } 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);
    }

    private ByteBuf compressContent(ChannelHandlerContext ctx, WebSocketFrame msg) {
        if (encoder == null) {
            encoder = EmbeddedChannel.builder()
                    .handlers(ZlibCodecFactory.newZlibEncoder(
                            ZlibWrapper.NONE, compressionLevel, windowSize, 8))

Frequently Asked Questions

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

Analyze Your Own Codebase

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

Try Supermodel Free