Both pull requests merged.. Thanks!

ZlibDecoder does not support preset dictionary
Attempting to create a ZlibDecoder using the preset dictionary constructor throws a compression exception:

org.jboss.netty.handler.codec.compression.CompressionException: failed to set the dictionary (-2)

z.inflateSetDictionary should not be called until the inflate returns JZlib.Z_NEED_DICT

codec/src/main/java/io/netty/handler/codec/compression/ZlibDecoder.java
codec/src/main/java/io/netty/handler/codec/compression/ZlibDecoder.java
diff --git a/codec/src/main/java/io/netty/handler/codec/compression/ZlibDecoder.java b/codec/src/main/java/io/netty/handler/codec/compression/ZlibDecoder.java
index 1c89d42436b..7904ef5b60d 100644
--- a/codec/src/main/java/io/netty/handler/codec/compression/ZlibDecoder.java
+++ b/codec/src/main/java/io/netty/handler/codec/compression/ZlibDecoder.java
@@ -32,6 +32,7 @@
 public class ZlibDecoder extends OneToOneDecoder {
 
     private final ZStream z = new ZStream();
+    private byte[] dictionary;
     private volatile boolean finished;
 
     /**
@@ -72,17 +73,13 @@ public ZlibDecoder(byte[] dictionary) {
         if (dictionary == null) {
             throw new NullPointerException("dictionary");
         }
+        this.dictionary = dictionary;
 
         synchronized (z) {
             int resultCode;
             resultCode = z.inflateInit(JZlib.W_ZLIB);
             if (resultCode != JZlib.Z_OK) {
                 ZlibUtil.fail(z, "initialization failure", resultCode);
-            } else {
-                resultCode = z.inflateSetDictionary(dictionary, dictionary.length);
-                if (resultCode != JZlib.Z_OK) {
-                    ZlibUtil.fail(z, "failed to set the dictionary", resultCode);
-                }
             }
         }
     }
@@ -131,6 +128,16 @@ protected Object decode(ChannelHandlerContext ctx, Channel channel, Object msg)
                     z.next_out_index = 0;
 
                     switch (resultCode) {
+                    case JZlib.Z_NEED_DICT:
+                        if (dictionary == null) {
+                            ZlibUtil.fail(z, "decompression failure", resultCode);
+                        } else {
+                            resultCode = z.inflateSetDictionary(dictionary, dictionary.length);
+                            if (resultCode != JZlib.Z_OK) {
+                                ZlibUtil.fail(z, "failed to set the dictionary", resultCode);
+                            }
+                        }
+                        break;
                     case JZlib.Z_STREAM_END:
                         finished = true; // Do not decode anymore.
                         z.inflateEnd();
