This is an automated email from the ASF dual-hosted git repository. asf-gitbox-commits pushed a commit to branch 2.0.X in repository https://gitbox.apache.org/repos/asf/mina.git
commit 7ffea06ee5ca205c76290659d19069b4a1c920b5 Author: Emmanuel Lécharny <[email protected]> AuthorDate: Sun May 24 12:09:26 2026 +0200 Bclport from 2.2.X --- .../mina/filter/compression/CompressionFilter.java | 80 +++++++++++++++++++--- 1 file changed, 71 insertions(+), 9 deletions(-) diff --git a/mina-filter-compression/src/main/java/org/apache/mina/filter/compression/CompressionFilter.java b/mina-filter-compression/src/main/java/org/apache/mina/filter/compression/CompressionFilter.java index e6b823e6f..15f3746e9 100644 --- a/mina-filter-compression/src/main/java/org/apache/mina/filter/compression/CompressionFilter.java +++ b/mina-filter-compression/src/main/java/org/apache/mina/filter/compression/CompressionFilter.java @@ -109,17 +109,18 @@ public class CompressionFilter extends WriteRequestFilter { private int maxDecompressedSize; /** Maximum decompression ratio **/ - private final long maxDecompressRatio; + private long maxDecompressRatio; /** Grace size before decompression ratio check is enforced **/ - private final long decompressRatioMinSize; + private long decompressRatioMinSize; /** * Creates a new instance which compresses outboud data and decompresses * inbound data with default compression level. */ public CompressionFilter() { - this(true, true, COMPRESSION_DEFAULT, Zlib.MAX_DECOMPRESSED_SIZE, Zlib.MAX_DECOMPRESS_RATIO, Zlib.DECOMPRESS_RATIO_MIN_SIZE); + this(true, true, COMPRESSION_DEFAULT, Zlib.MAX_DECOMPRESSED_SIZE, Zlib.MAX_DECOMPRESS_RATIO, + Zlib.DECOMPRESS_RATIO_MIN_SIZE); } /** @@ -133,7 +134,8 @@ public class CompressionFilter extends WriteRequestFilter { * {@link #COMPRESSION_NONE}. */ public CompressionFilter(final int compressionLevel) { - this(true, true, compressionLevel, Zlib.MAX_DECOMPRESSED_SIZE, Zlib.MAX_DECOMPRESS_RATIO, Zlib.DECOMPRESS_RATIO_MIN_SIZE); + this(true, true, compressionLevel, Zlib.MAX_DECOMPRESSED_SIZE, Zlib.MAX_DECOMPRESS_RATIO, + Zlib.DECOMPRESS_RATIO_MIN_SIZE); } /** @@ -149,7 +151,8 @@ public class CompressionFilter extends WriteRequestFilter { */ public CompressionFilter(final boolean compressInbound, final boolean compressOutbound, final int compressionLevel) { - this(compressInbound, compressOutbound, compressionLevel, Zlib.MAX_DECOMPRESSED_SIZE, Zlib.MAX_DECOMPRESS_RATIO, Zlib.DECOMPRESS_RATIO_MIN_SIZE); + this(compressInbound, compressOutbound, compressionLevel, Zlib.MAX_DECOMPRESSED_SIZE, + Zlib.MAX_DECOMPRESS_RATIO, Zlib.DECOMPRESS_RATIO_MIN_SIZE); } /** @@ -169,7 +172,8 @@ public class CompressionFilter extends WriteRequestFilter { */ public CompressionFilter(final boolean compressInbound, final boolean compressOutbound, final int compressionLevel, final int maxDecompressedSize) { - this(compressInbound, compressOutbound, compressionLevel, maxDecompressedSize, Zlib.MAX_DECOMPRESS_RATIO, Zlib.DECOMPRESS_RATIO_MIN_SIZE); + this(compressInbound, compressOutbound, compressionLevel, maxDecompressedSize, Zlib.MAX_DECOMPRESS_RATIO, + Zlib.DECOMPRESS_RATIO_MIN_SIZE); } /** @@ -257,8 +261,10 @@ public class CompressionFilter extends WriteRequestFilter { throw new IllegalStateException("Only one " + CompressionFilter.class + " is permitted."); } - Zlib deflater = new Zlib(compressionLevel, Zlib.MODE_INFLATER, maxDecompressedSize, maxDecompressRatio, decompressRatioMinSize); - Zlib inflater = new Zlib(compressionLevel, Zlib.MODE_INFLATER, maxDecompressedSize, maxDecompressRatio, decompressRatioMinSize); + Zlib deflater = new Zlib(compressionLevel, Zlib.MODE_INFLATER, maxDecompressedSize, + maxDecompressRatio, decompressRatioMinSize); + Zlib inflater = new Zlib(compressionLevel, Zlib.MODE_INFLATER, maxDecompressedSize, + maxDecompressRatio, decompressRatioMinSize); IoSession session = parent.getSession(); @@ -267,7 +273,49 @@ public class CompressionFilter extends WriteRequestFilter { } /** - * @return {@code true} if incoming data is being compressed. + * Set the compression level. On of: + * <ul> + * <li>Zlib.COMPRESSION_DEFAULT (-1)</li> + * <li>Zlib.COMPRESSION_NONE (0)</li> + * <li>Zlib.COMPRESSION_MIN (1)</li> + * <li>Zlib.COMPRESSION_MAX (9)</li> + * </ul> + * + * @param compressionLevel The compression level to set + * @ The CompressionFilter instance + */ + public CompressionFilter setCompressionLevel(int compressionLevel) { + this.compressionLevel = compressionLevel; + + return this; + } + + /** + * Set The maximum decompressed size, to avoid an OOM. Default to 1Mb + * + * @param maxDecompressedSize The maximum decompressed size + * @return The CompressionFilter instance + */ + public CompressionFilter setMaxDecompressedSize(int maxDecompressedSize) { + this.maxDecompressedSize = maxDecompressedSize; + + return this; + } + + /** + * Grace size before decompression ratio check is enforced. Default to 1Mb. + * + * @param decompressRatioMinSize The maximum decompressed size before the ratio is checked + * @return The CompressionFilter instance + */ + public CompressionFilter setDecompressRatioMinSize(long decompressRatioMinSize) { + this.decompressRatioMinSize = decompressRatioMinSize; + + return this; + } + + /** + * @return <code>true</code> if incoming data is being compressed. */ public boolean isCompressInbound() { return compressInbound; @@ -281,6 +329,20 @@ public class CompressionFilter extends WriteRequestFilter { public void setCompressInbound(boolean compressInbound) { this.compressInbound = compressInbound; } + + /** + * Set the max alloweed compression ratio. If the inflated buffer exceed this ratio, + * an error will be generated. Note that the <code>decompressRatioMinSize</code> parameter + * can be used to avoid bailing out for small inflated files with a high compression ratio. + * + * @param maxDecompressRatio The maximum allowed compression ratio. Defaults to 100. + * @return + */ + public CompressionFilter setMaxDecompressRatio(long maxDecompressRatio) { + this.maxDecompressRatio = maxDecompressRatio; + + return this; + } /** * @return {@code true} if the filter is compressing data being written.
