From 942b746d730566001301f8edc774d571bcbbf175 Mon Sep 17 00:00:00 2001 From: Sun Ning Date: Sat, 5 Nov 2011 22:09:27 +0800 Subject: [PATCH] add an option in LengthFieldBasedFrameDecoder for whether to count the length field into frame length. --- .../frame/LengthFieldBasedFrameDecoder.java | 34 +++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) 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 292f24a68e..2733109f29 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 @@ -195,6 +195,7 @@ public class LengthFieldBasedFrameDecoder extends FrameDecoder { private final int lengthFieldEndOffset; private final int lengthAdjustment; private final int initialBytesToStrip; + private final boolean lengthFieldIncludedInFrameLength; private boolean discardingTooLongFrame; private long tooLongFrameLength; private long bytesToDiscard; @@ -215,7 +216,7 @@ public class LengthFieldBasedFrameDecoder extends FrameDecoder { public LengthFieldBasedFrameDecoder( int maxFrameLength, int lengthFieldOffset, int lengthFieldLength) { - this(maxFrameLength, lengthFieldOffset, lengthFieldLength, 0, 0); + this(maxFrameLength, lengthFieldOffset, lengthFieldLength, 0, 0, false); } /** @@ -238,6 +239,32 @@ public class LengthFieldBasedFrameDecoder extends FrameDecoder { int maxFrameLength, int lengthFieldOffset, int lengthFieldLength, int lengthAdjustment, int initialBytesToStrip) { + this(maxFrameLength, lengthFieldOffset, lengthFieldOffset, lengthAdjustment, + initialBytesToStrip, false); + } + + /** + * Creates a new instance. + * + * @param maxFrameLength + * the maximum length of the frame. If the length of the frame is + * greater than this value, {@link TooLongFrameException} will be + * thrown. + * @param lengthFieldOffset + * the offset of the length field + * @param lengthFieldLength + * the length of the length field + * @param lengthAdjustment + * the compensation value to add to the value of the length field + * @param initialBytesToStrip + * the number of first bytes to strip out from the decoded frame + * @param lengthFieldIncludedInFrameLength + * whether to count length field into frame length + */ + public LengthFieldBasedFrameDecoder( + int maxFrameLength, + int lengthFieldOffset, int lengthFieldLength, + int lengthAdjustment, int initialBytesToStrip, boolean lengthFieldIncludedInFrameLength) { if (maxFrameLength <= 0) { throw new IllegalArgumentException( "maxFrameLength must be a positive integer: " + @@ -278,6 +305,7 @@ public class LengthFieldBasedFrameDecoder extends FrameDecoder { this.lengthAdjustment = lengthAdjustment; lengthFieldEndOffset = lengthFieldOffset + lengthFieldLength; this.initialBytesToStrip = initialBytesToStrip; + this.lengthFieldIncludedInFrameLength = lengthFieldIncludedInFrameLength; } @Override @@ -326,7 +354,9 @@ public class LengthFieldBasedFrameDecoder extends FrameDecoder { "negative pre-adjustment length field: " + frameLength); } - frameLength += lengthAdjustment + lengthFieldEndOffset; + if (!lengthFieldIncludedInFrameLength) { + frameLength += lengthAdjustment + lengthFieldEndOffset; + } if (frameLength < lengthFieldEndOffset) { buffer.skipBytes(lengthFieldEndOffset); throw new CorruptedFrameException(