Home / Class/ SpdyHeaderBlockZlibEncoder Class — netty Architecture

SpdyHeaderBlockZlibEncoder Class — netty Architecture

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

Entity Profile

Dependency Diagram

graph TD
  ee5cb7c0_3853_3f2d_592d_ad4d03df48a3["SpdyHeaderBlockZlibEncoder"]
  dfcf49d9_ada6_be43_47cb_2ac664944ac9["SpdyHeaderBlockZlibEncoder.java"]
  ee5cb7c0_3853_3f2d_592d_ad4d03df48a3 -->|defined in| dfcf49d9_ada6_be43_47cb_2ac664944ac9
  2c2fb56a_278e_12fa_d56f_7b1124bfe0ec["SpdyHeaderBlockZlibEncoder()"]
  ee5cb7c0_3853_3f2d_592d_ad4d03df48a3 -->|method| 2c2fb56a_278e_12fa_d56f_7b1124bfe0ec
  f113f3d7_a047_f905_66f6_eddbc17f3072["setInput()"]
  ee5cb7c0_3853_3f2d_592d_ad4d03df48a3 -->|method| f113f3d7_a047_f905_66f6_eddbc17f3072
  c720c12f_ae58_674a_a621_ba0a1ec05575["ByteBuf()"]
  ee5cb7c0_3853_3f2d_592d_ad4d03df48a3 -->|method| c720c12f_ae58_674a_a621_ba0a1ec05575
  45f16463_fafa_37e4_316d_396f14381cb1["compressInto()"]
  ee5cb7c0_3853_3f2d_592d_ad4d03df48a3 -->|method| 45f16463_fafa_37e4_316d_396f14381cb1
  acff9ac4_b0e6_d55a_e413_eb5012ac9142["end()"]
  ee5cb7c0_3853_3f2d_592d_ad4d03df48a3 -->|method| acff9ac4_b0e6_d55a_e413_eb5012ac9142

Relationship Graph

Source Code

codec-http/src/main/java/io/netty/handler/codec/spdy/SpdyHeaderBlockZlibEncoder.java lines 27–114

class SpdyHeaderBlockZlibEncoder extends SpdyHeaderBlockRawEncoder {

    private final Deflater compressor;

    private boolean finished;

    SpdyHeaderBlockZlibEncoder(SpdyVersion spdyVersion, int compressionLevel) {
        super(spdyVersion);
        if (compressionLevel < 0 || compressionLevel > 9) {
            throw new IllegalArgumentException(
                    "compressionLevel: " + compressionLevel + " (expected: 0-9)");
        }
        compressor = new Deflater(compressionLevel);
        compressor.setDictionary(SPDY_DICT);
    }

    private int setInput(ByteBuf decompressed) {
        int len = decompressed.readableBytes();

        if (decompressed.hasArray()) {
            compressor.setInput(decompressed.array(), decompressed.arrayOffset() + decompressed.readerIndex(), len);
        } else {
            byte[] in = new byte[len];
            decompressed.getBytes(decompressed.readerIndex(), in);
            compressor.setInput(in, 0, in.length);
        }

        return len;
    }

    private ByteBuf encode(ByteBufAllocator alloc, int len) {
        ByteBuf compressed = alloc.heapBuffer(len);
        boolean release = true;
        try {
            while (compressInto(compressed)) {
                // Although unlikely, it's possible that the compressed size is larger than the decompressed size
                compressed.ensureWritable(compressed.capacity() << 1);
            }
            release = false;
            return compressed;
        } finally {
            if (release) {
                compressed.release();
            }
        }
    }

    private boolean compressInto(ByteBuf compressed) {
        byte[] out = compressed.array();
        int off = compressed.arrayOffset() + compressed.writerIndex();
        int toWrite = compressed.writableBytes();
        final int numBytes = compressor.deflate(out, off, toWrite, Deflater.SYNC_FLUSH);
        compressed.writerIndex(compressed.writerIndex() + numBytes);
        return numBytes == toWrite;
    }

    @Override
    public ByteBuf encode(ByteBufAllocator alloc, SpdyHeadersFrame frame) throws Exception {
        checkNotNullWithIAE(alloc, "alloc");
        checkNotNullWithIAE(frame, "frame");

        if (finished) {
            return Unpooled.EMPTY_BUFFER;
        }

        ByteBuf decompressed = super.encode(alloc, frame);
        try {
            if (!decompressed.isReadable()) {
                return Unpooled.EMPTY_BUFFER;
            }

            int len = setInput(decompressed);
            return encode(alloc, len);
        } finally {
            decompressed.release();
        }
    }

    @Override
    public void end() {
        if (finished) {

Frequently Asked Questions

What is the SpdyHeaderBlockZlibEncoder class?
SpdyHeaderBlockZlibEncoder is a class in the netty codebase, defined in codec-http/src/main/java/io/netty/handler/codec/spdy/SpdyHeaderBlockZlibEncoder.java.
Where is SpdyHeaderBlockZlibEncoder defined?
SpdyHeaderBlockZlibEncoder is defined in codec-http/src/main/java/io/netty/handler/codec/spdy/SpdyHeaderBlockZlibEncoder.java at line 27.

Analyze Your Own Codebase

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

Try Supermodel Free