From 3acda248c1ebdea704ba9aba0ee113389222d3fa Mon Sep 17 00:00:00 2001 From: Trustin Lee Date: Wed, 3 Jun 2009 08:58:06 +0000 Subject: [PATCH] Fixed issue: NETTY-164 ReplayingDecoderBuffer.readableBytes() and capacity() should not return Integer.MAX_VALUE if the connection is closed. * Added ReplayingDecoderBuffer.terminate(), which makes readableBytes() and capacity() to return an ordinary value instead of Integer.MAX_VALUE --- .../handler/codec/replay/ReplayingDecoder.java | 1 + .../codec/replay/ReplayingDecoderBuffer.java | 17 +++++++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/jboss/netty/handler/codec/replay/ReplayingDecoder.java b/src/main/java/org/jboss/netty/handler/codec/replay/ReplayingDecoder.java index a9bee7c2a3..2bc6696ab6 100644 --- a/src/main/java/org/jboss/netty/handler/codec/replay/ReplayingDecoder.java +++ b/src/main/java/org/jboss/netty/handler/codec/replay/ReplayingDecoder.java @@ -455,6 +455,7 @@ public abstract class ReplayingDecoder> private void cleanup(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception { ChannelBuffer cumulation = cumulation(ctx); + replayable.terminate(); try { if (cumulation.readable()) { // Make sure all data was read before notifying a closed channel. diff --git a/src/main/java/org/jboss/netty/handler/codec/replay/ReplayingDecoderBuffer.java b/src/main/java/org/jboss/netty/handler/codec/replay/ReplayingDecoderBuffer.java index 88846aaf79..6f48d5f26d 100644 --- a/src/main/java/org/jboss/netty/handler/codec/replay/ReplayingDecoderBuffer.java +++ b/src/main/java/org/jboss/netty/handler/codec/replay/ReplayingDecoderBuffer.java @@ -46,13 +46,22 @@ class ReplayingDecoderBuffer implements ChannelBuffer { private static final Error REPLAY = new ReplayError(); private final ChannelBuffer buffer; + private boolean terminated; ReplayingDecoderBuffer(ChannelBuffer buffer) { this.buffer = buffer; } + void terminate() { + terminated = true; + } + public int capacity() { - return Integer.MAX_VALUE; + if (terminated) { + return buffer.capacity(); + } else { + return Integer.MAX_VALUE; + } } public void clear() { @@ -210,7 +219,11 @@ class ReplayingDecoderBuffer implements ChannelBuffer { } public int readableBytes() { - return Integer.MAX_VALUE - buffer.readerIndex(); + if (terminated) { + return buffer.readableBytes(); + } else { + return Integer.MAX_VALUE - buffer.readerIndex(); + } } public byte readByte() {