From 2b2d53ff62436c20604ec4e900889cd5bbbae0dc Mon Sep 17 00:00:00 2001 From: Trustin Lee Date: Fri, 16 Oct 2009 04:50:50 +0000 Subject: [PATCH] * Correct byte order * All encoders should ignore the message whose type is unknown to the encoder --- .../java/org/jboss/netty/handler/codec/base64/Base64.java | 3 ++- .../netty/handler/codec/frame/LengthFieldPrepender.java | 6 +++++- .../protobuf/ProtobufVarint32LengthFieldPrepender.java | 5 +++++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/jboss/netty/handler/codec/base64/Base64.java b/src/main/java/org/jboss/netty/handler/codec/base64/Base64.java index e30d1fff43..7772556691 100644 --- a/src/main/java/org/jboss/netty/handler/codec/base64/Base64.java +++ b/src/main/java/org/jboss/netty/handler/codec/base64/Base64.java @@ -167,6 +167,7 @@ public class Base64 { int len43 = len * 4 / 3; ChannelBuffer dest = bufferFactory.getBuffer( + src.order(), len43 + (len % 3 > 0? 4 : 0) + // Account for padding (breakLines? len43 / MAX_LINE_LENGTH : 0)); // New lines @@ -292,7 +293,7 @@ public class Base64 { byte[] DECODABET = decodabet(dialect); int len34 = len * 3 / 4; - ChannelBuffer dest = bufferFactory.getBuffer(len34); // Upper limit on size of output + ChannelBuffer dest = bufferFactory.getBuffer(src.order(), len34); // Upper limit on size of output int outBuffPosn = 0; byte[] b4 = new byte[4]; diff --git a/src/main/java/org/jboss/netty/handler/codec/frame/LengthFieldPrepender.java b/src/main/java/org/jboss/netty/handler/codec/frame/LengthFieldPrepender.java index 5b7e29b552..8cee2417c2 100644 --- a/src/main/java/org/jboss/netty/handler/codec/frame/LengthFieldPrepender.java +++ b/src/main/java/org/jboss/netty/handler/codec/frame/LengthFieldPrepender.java @@ -107,8 +107,12 @@ public class LengthFieldPrepender extends OneToOneEncoder { @Override protected Object encode( ChannelHandlerContext ctx, Channel channel, Object msg) throws Exception { - ChannelBuffer header = channel.getConfig().getBufferFactory().getBuffer(lengthFieldLength); + if (!(msg instanceof ChannelBuffer)) { + return msg; + } + ChannelBuffer body = (ChannelBuffer) msg; + ChannelBuffer header = channel.getConfig().getBufferFactory().getBuffer(body.order(), lengthFieldLength); int length = lengthIncludesLengthFieldLength? body.readableBytes() + lengthFieldLength : body.readableBytes(); diff --git a/src/main/java/org/jboss/netty/handler/codec/protobuf/ProtobufVarint32LengthFieldPrepender.java b/src/main/java/org/jboss/netty/handler/codec/protobuf/ProtobufVarint32LengthFieldPrepender.java index 11a3079c57..4568b9edaa 100644 --- a/src/main/java/org/jboss/netty/handler/codec/protobuf/ProtobufVarint32LengthFieldPrepender.java +++ b/src/main/java/org/jboss/netty/handler/codec/protobuf/ProtobufVarint32LengthFieldPrepender.java @@ -44,10 +44,15 @@ public class ProtobufVarint32LengthFieldPrepender extends OneToOneEncoder { @Override protected Object encode(ChannelHandlerContext ctx, Channel channel, Object msg) throws Exception { + if (!(msg instanceof ChannelBuffer)) { + return msg; + } + ChannelBuffer body = (ChannelBuffer) msg; int length = body.readableBytes(); ChannelBuffer header = channel.getConfig().getBufferFactory().getBuffer( + body.order(), CodedOutputStream.computeRawVarint32Size(length)); CodedOutputStream codedOutputStream = CodedOutputStream .newInstance(new ChannelBufferOutputStream(header));