This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/master by this push: new 23cde6d CAMEL-13527: Implement missing optimisation for DelimiterBasedFrameDecoder 23cde6d is described below commit 23cde6d7d9be0d3ab877f4fba0774c5fad11ad16 Author: Jan Bednář <m...@janbednar.eu> AuthorDate: Wed May 15 23:02:52 2019 +0200 CAMEL-13527: Implement missing optimisation for DelimiterBasedFrameDecoder --- .../netty4/codec/DelimiterBasedFrameDecoder.java | 27 +++++++++++++++++++++- ...rameDecoder.java => LineBasedFrameDecoder.java} | 15 +++++------- 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/components/camel-netty4/src/main/java/org/apache/camel/component/netty4/codec/DelimiterBasedFrameDecoder.java b/components/camel-netty4/src/main/java/org/apache/camel/component/netty4/codec/DelimiterBasedFrameDecoder.java index fc6b8f6..5d6d0e0 100644 --- a/components/camel-netty4/src/main/java/org/apache/camel/component/netty4/codec/DelimiterBasedFrameDecoder.java +++ b/components/camel-netty4/src/main/java/org/apache/camel/component/netty4/codec/DelimiterBasedFrameDecoder.java @@ -21,14 +21,39 @@ import io.netty.channel.ChannelHandlerContext; public class DelimiterBasedFrameDecoder extends io.netty.handler.codec.DelimiterBasedFrameDecoder { + private final LineBasedFrameDecoder lineBasedFrameDecoder; + public DelimiterBasedFrameDecoder(int maxFrameLength, boolean stripDelimiter, ByteBuf[] delimiters) { super(maxFrameLength, stripDelimiter, delimiters); + if (isLineBased(delimiters)) { + this.lineBasedFrameDecoder = new LineBasedFrameDecoder(maxFrameLength, stripDelimiter, true); + } else { + this.lineBasedFrameDecoder = null; + } } @Override public Object decode(ChannelHandlerContext ctx, ByteBuf in) throws Exception { + if (lineBasedFrameDecoder != null) { + return lineBasedFrameDecoder.decode(ctx, in); + } return super.decode(ctx, in); } - + /** Returns true if the delimiters are "\n" and "\r\n". + * Copied from io.netty.handler.codec.DelimiterBasedFrameDecoder */ + private static boolean isLineBased(final ByteBuf[] delimiters) { + if (delimiters.length != 2) { + return false; + } + ByteBuf a = delimiters[0]; + ByteBuf b = delimiters[1]; + if (a.capacity() < b.capacity()) { + a = delimiters[1]; + b = delimiters[0]; + } + return a.capacity() == 2 && b.capacity() == 1 + && a.getByte(0) == '\r' && a.getByte(1) == '\n' + && b.getByte(0) == '\n'; + } } diff --git a/components/camel-netty4/src/main/java/org/apache/camel/component/netty4/codec/DelimiterBasedFrameDecoder.java b/components/camel-netty4/src/main/java/org/apache/camel/component/netty4/codec/LineBasedFrameDecoder.java similarity index 70% copy from components/camel-netty4/src/main/java/org/apache/camel/component/netty4/codec/DelimiterBasedFrameDecoder.java copy to components/camel-netty4/src/main/java/org/apache/camel/component/netty4/codec/LineBasedFrameDecoder.java index fc6b8f6..afbc9ef 100644 --- a/components/camel-netty4/src/main/java/org/apache/camel/component/netty4/codec/DelimiterBasedFrameDecoder.java +++ b/components/camel-netty4/src/main/java/org/apache/camel/component/netty4/codec/LineBasedFrameDecoder.java @@ -19,16 +19,13 @@ package org.apache.camel.component.netty4.codec; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; -public class DelimiterBasedFrameDecoder extends io.netty.handler.codec.DelimiterBasedFrameDecoder { - - public DelimiterBasedFrameDecoder(int maxFrameLength, boolean stripDelimiter, ByteBuf[] delimiters) { - super(maxFrameLength, stripDelimiter, delimiters); +public class LineBasedFrameDecoder extends io.netty.handler.codec.LineBasedFrameDecoder { + public LineBasedFrameDecoder(int maxLength, boolean stripDelimiter, boolean failFast) { + super(maxLength, stripDelimiter, failFast); } - + @Override - public Object decode(ChannelHandlerContext ctx, ByteBuf in) throws Exception { - return super.decode(ctx, in); + public Object decode(ChannelHandlerContext ctx, ByteBuf buffer) throws Exception { + return super.decode(ctx, buffer); } - - }