diff --git a/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/extensions/compression/PerMessageDeflateClientExtensionHandshaker.java b/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/extensions/compression/PerMessageDeflateClientExtensionHandshaker.java index ead44b45ba..ef3dfe7245 100644 --- a/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/extensions/compression/PerMessageDeflateClientExtensionHandshaker.java +++ b/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/extensions/compression/PerMessageDeflateClientExtensionHandshaker.java @@ -17,6 +17,8 @@ package io.netty.handler.codec.http.websocketx.extensions.compression; import static io.netty.handler.codec.http.websocketx.extensions.compression. PerMessageDeflateServerExtensionHandshaker.*; + +import io.netty.handler.codec.compression.ZlibCodecFactory; import io.netty.handler.codec.http.websocketx.extensions.WebSocketClientExtension; import io.netty.handler.codec.http.websocketx.extensions.WebSocketClientExtensionHandshaker; import io.netty.handler.codec.http.websocketx.extensions.WebSocketExtensionData; @@ -43,7 +45,7 @@ public final class PerMessageDeflateClientExtensionHandshaker implements WebSock * Constructor with default configuration. */ public PerMessageDeflateClientExtensionHandshaker() { - this(6, false, MAX_WINDOW_SIZE, false, false); + this(6, ZlibCodecFactory.isSupportingWindowSizeAndMemLevel(), MAX_WINDOW_SIZE, false, false); } /** diff --git a/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/extensions/compression/PerMessageDeflateServerExtensionHandshaker.java b/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/extensions/compression/PerMessageDeflateServerExtensionHandshaker.java index 685e6d6d1c..738b6f927d 100644 --- a/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/extensions/compression/PerMessageDeflateServerExtensionHandshaker.java +++ b/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/extensions/compression/PerMessageDeflateServerExtensionHandshaker.java @@ -15,6 +15,7 @@ */ package io.netty.handler.codec.http.websocketx.extensions.compression; +import io.netty.handler.codec.compression.ZlibCodecFactory; import io.netty.handler.codec.http.websocketx.extensions.WebSocketExtensionData; import io.netty.handler.codec.http.websocketx.extensions.WebSocketExtensionDecoder; import io.netty.handler.codec.http.websocketx.extensions.WebSocketExtensionEncoder; @@ -50,7 +51,7 @@ public final class PerMessageDeflateServerExtensionHandshaker implements WebSock * Constructor with default configuration. */ public PerMessageDeflateServerExtensionHandshaker() { - this(6, false, MAX_WINDOW_SIZE, false, false); + this(6, ZlibCodecFactory.isSupportingWindowSizeAndMemLevel(), MAX_WINDOW_SIZE, false, false); } /** diff --git a/codec-http/src/test/java/io/netty/handler/codec/http/websocketx/extensions/compression/PerMessageDeflateClientExtensionHandshakerTest.java b/codec-http/src/test/java/io/netty/handler/codec/http/websocketx/extensions/compression/PerMessageDeflateClientExtensionHandshakerTest.java index f221100e48..acf6739fef 100644 --- a/codec-http/src/test/java/io/netty/handler/codec/http/websocketx/extensions/compression/PerMessageDeflateClientExtensionHandshakerTest.java +++ b/codec-http/src/test/java/io/netty/handler/codec/http/websocketx/extensions/compression/PerMessageDeflateClientExtensionHandshakerTest.java @@ -18,6 +18,8 @@ package io.netty.handler.codec.http.websocketx.extensions.compression; import static io.netty.handler.codec.http.websocketx.extensions.compression. PerMessageDeflateServerExtensionHandshaker.*; import static org.junit.Assert.*; + +import io.netty.handler.codec.compression.ZlibCodecFactory; import io.netty.handler.codec.http.websocketx.extensions.WebSocketClientExtension; import io.netty.handler.codec.http.websocketx.extensions.WebSocketExtensionData; @@ -37,7 +39,7 @@ public class PerMessageDeflateClientExtensionHandshakerTest { WebSocketExtensionData data = handshaker.newRequestData(); assertEquals(PERMESSAGE_DEFLATE_EXTENSION, data.name()); - assertTrue(data.parameters().isEmpty()); + assertEquals(ZlibCodecFactory.isSupportingWindowSizeAndMemLevel() ? 1 : 0, data.parameters().size()); } @Test diff --git a/codec/src/main/java/io/netty/handler/codec/compression/ZlibCodecFactory.java b/codec/src/main/java/io/netty/handler/codec/compression/ZlibCodecFactory.java index 81156f63c7..e913bdb7a5 100644 --- a/codec/src/main/java/io/netty/handler/codec/compression/ZlibCodecFactory.java +++ b/codec/src/main/java/io/netty/handler/codec/compression/ZlibCodecFactory.java @@ -31,6 +31,7 @@ public final class ZlibCodecFactory { private static final boolean noJdkZlibDecoder; private static final boolean noJdkZlibEncoder; + private static final boolean supportsWindowSizeAndMemLevel; static { noJdkZlibDecoder = SystemPropertyUtil.getBoolean("io.netty.noJdkZlibDecoder", @@ -39,6 +40,15 @@ public final class ZlibCodecFactory { noJdkZlibEncoder = SystemPropertyUtil.getBoolean("io.netty.noJdkZlibEncoder", false); logger.debug("-Dio.netty.noJdkZlibEncoder: {}", noJdkZlibEncoder); + + supportsWindowSizeAndMemLevel = noJdkZlibDecoder || PlatformDependent.javaVersion() >= 7; + } + + /** + * Returns {@code true} if specify a custom window size and mem level is supported. + */ + public static boolean isSupportingWindowSizeAndMemLevel() { + return supportsWindowSizeAndMemLevel; } public static ZlibEncoder newZlibEncoder(int compressionLevel) {