From ab0facdee593d611445c9cbafbba27b0374c41c0 Mon Sep 17 00:00:00 2001 From: Trustin Lee Date: Thu, 24 Jun 2010 01:53:51 +0000 Subject: [PATCH] * Discard too long frame in a more robust manner (i.e. should continue decoding after raising TooLongFrameException) --- .../frame/DelimiterBasedFrameDecoder.java | 4 +-- .../frame/LengthFieldBasedFrameDecoder.java | 26 +++++++++++++++---- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/jboss/netty/handler/codec/frame/DelimiterBasedFrameDecoder.java b/src/main/java/org/jboss/netty/handler/codec/frame/DelimiterBasedFrameDecoder.java index 89fe745d10..c45940b9c1 100644 --- a/src/main/java/org/jboss/netty/handler/codec/frame/DelimiterBasedFrameDecoder.java +++ b/src/main/java/org/jboss/netty/handler/codec/frame/DelimiterBasedFrameDecoder.java @@ -214,13 +214,13 @@ public class DelimiterBasedFrameDecoder extends FrameDecoder { Channels.fireExceptionCaught( ctx.getChannel(), new TooLongFrameException( - "The frame length exceeds " + maxFrameLength + + "frame length exceeds " + maxFrameLength + ": " + frameLength + " - discarded")); } else { Channels.fireExceptionCaught( ctx.getChannel(), new TooLongFrameException( - "The frame length exceeds " + maxFrameLength + + "frame length exceeds " + maxFrameLength + " - discarding")); } } diff --git a/src/main/java/org/jboss/netty/handler/codec/frame/LengthFieldBasedFrameDecoder.java b/src/main/java/org/jboss/netty/handler/codec/frame/LengthFieldBasedFrameDecoder.java index 4daaf35dcd..363b44ceec 100644 --- a/src/main/java/org/jboss/netty/handler/codec/frame/LengthFieldBasedFrameDecoder.java +++ b/src/main/java/org/jboss/netty/handler/codec/frame/LengthFieldBasedFrameDecoder.java @@ -19,6 +19,7 @@ import org.jboss.netty.buffer.ChannelBuffer; import org.jboss.netty.buffer.ChannelBufferFactory; import org.jboss.netty.channel.Channel; import org.jboss.netty.channel.ChannelHandlerContext; +import org.jboss.netty.channel.Channels; import org.jboss.netty.handler.codec.serialization.ObjectDecoder; /** @@ -292,16 +293,15 @@ public class LengthFieldBasedFrameDecoder extends FrameDecoder { if (bytesToDiscard == 0) { // Reset to the initial state and tell the handlers that // the frame was too large. - discardingTooLongFrame = false; + // TODO Let user choose when the exception should be raised - early or late? + // If early, fail() should be called when discardingTooLongFrame is set to true. long tooLongFrameLength = this.tooLongFrameLength; this.tooLongFrameLength = 0; - throw new TooLongFrameException( - "Adjusted frame length exceeds " + maxFrameLength + - ": " + tooLongFrameLength); + fail(ctx, tooLongFrameLength); } else { // Keep discarding. - return null; } + return null; } if (buffer.readableBytes() < lengthFieldEndOffset) { @@ -395,4 +395,20 @@ public class LengthFieldBasedFrameDecoder extends FrameDecoder { frame.writeBytes(buffer, index, length); return frame; } + + private void fail(ChannelHandlerContext ctx, long frameLength) { + if (frameLength > 0) { + Channels.fireExceptionCaught( + ctx.getChannel(), + new TooLongFrameException( + "Adjusted frame length exceeds " + maxFrameLength + + ": " + frameLength + " - discarded")); + } else { + Channels.fireExceptionCaught( + ctx.getChannel(), + new TooLongFrameException( + "Adjusted frame length exceeds " + maxFrameLength + + " - discarding")); + } + } }