diff --git a/transport/src/main/java/io/netty/channel/DefaultChannelPipeline.java b/transport/src/main/java/io/netty/channel/DefaultChannelPipeline.java index c6684ad8ae..1b11a0707c 100644 --- a/transport/src/main/java/io/netty/channel/DefaultChannelPipeline.java +++ b/transport/src/main/java/io/netty/channel/DefaultChannelPipeline.java @@ -342,20 +342,12 @@ public class DefaultChannelPipeline implements ChannelPipeline { @Override public final ChannelPipeline addFirst(EventExecutorGroup executor, ChannelHandler... handlers) { ObjectUtil.checkNotNull(handlers, "handlers"); - if (handlers.length == 0 || handlers[0] == null) { - return this; - } - int size; - for (size = 1; size < handlers.length; size ++) { - if (handlers[size] == null) { - break; - } - } - - for (int i = size - 1; i >= 0; i --) { + for (int i = handlers.length - 1; i >= 0; i--) { ChannelHandler h = handlers[i]; - addFirst(executor, null, h); + if (h != null) { + addFirst(executor, null, h); + } } return this; @@ -374,11 +366,10 @@ public class DefaultChannelPipeline implements ChannelPipeline { public final ChannelPipeline addLast(EventExecutorGroup executor, ChannelHandler... handlers) { ObjectUtil.checkNotNull(handlers, "handlers"); - for (ChannelHandler h: handlers) { - if (h == null) { - break; + for (ChannelHandler h : handlers) { + if (h != null) { + addLast(executor, null, h); } - addLast(executor, null, h); } return this; diff --git a/transport/src/test/java/io/netty/channel/DefaultChannelPipelineTest.java b/transport/src/test/java/io/netty/channel/DefaultChannelPipelineTest.java index 4c012ec7f6..6fdbfdf6d7 100644 --- a/transport/src/test/java/io/netty/channel/DefaultChannelPipelineTest.java +++ b/transport/src/test/java/io/netty/channel/DefaultChannelPipelineTest.java @@ -171,6 +171,44 @@ public class DefaultChannelPipelineTest { } } + @Test + public void testAddLastVarArgsSkipsNull() { + ChannelPipeline pipeline = new LocalChannel().pipeline(); + assertEquals(1, pipeline.names().size()); + + pipeline.addLast((ChannelHandler) null, newHandler(), null); + assertEquals(2, pipeline.names().size()); + assertEquals("DefaultChannelPipelineTest$TestHandler#0", pipeline.names().get(0)); + + pipeline.addLast(newHandler(), null, newHandler()); + assertEquals(4, pipeline.names().size()); + assertEquals("DefaultChannelPipelineTest$TestHandler#0", pipeline.names().get(0)); + assertEquals("DefaultChannelPipelineTest$TestHandler#1", pipeline.names().get(1)); + assertEquals("DefaultChannelPipelineTest$TestHandler#2", pipeline.names().get(2)); + + pipeline.addLast((ChannelHandler) null); + assertEquals(4, pipeline.names().size()); + } + + @Test + public void testAddFirstVarArgsSkipsNull() { + ChannelPipeline pipeline = new LocalChannel().pipeline(); + assertEquals(1, pipeline.names().size()); + + pipeline.addFirst((ChannelHandler) null, newHandler(), null); + assertEquals(2, pipeline.names().size()); + assertEquals("DefaultChannelPipelineTest$TestHandler#0", pipeline.names().get(0)); + + pipeline.addFirst(newHandler(), null, newHandler()); + assertEquals(4, pipeline.names().size()); + assertEquals("DefaultChannelPipelineTest$TestHandler#2", pipeline.names().get(0)); + assertEquals("DefaultChannelPipelineTest$TestHandler#1", pipeline.names().get(1)); + assertEquals("DefaultChannelPipelineTest$TestHandler#0", pipeline.names().get(2)); + + pipeline.addFirst((ChannelHandler) null); + assertEquals(4, pipeline.names().size()); + } + @Test public void testRemoveChannelHandler() { ChannelPipeline pipeline = new LocalChannel().pipeline();