This is an automated email from the ASF dual-hosted git repository.

spacewander pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/apisix-java-plugin-runner.git


The following commit(s) were added to refs/heads/main by this push:
     new b7c0de8  fix: ensure correct encoding and decoding when data length is 
greater than 256 (#32)
b7c0de8 is described below

commit b7c0de81b836b9feeecba1c008ca422e4b09cb13
Author: tzssangglass <[email protected]>
AuthorDate: Tue Jun 15 20:34:47 2021 +0800

    fix: ensure correct encoding and decoding when data length is greater than 
256 (#32)
---
 .../plugin/runner/codec/impl/FlatBuffersDecoder.java   | 15 ++++++++++-----
 .../plugin/runner/codec/impl/FlatBuffersEncoder.java   | 14 +++++++-------
 .../runner/codec/impl/FlatBuffersDecoderTest.java      | 17 +++++++++++++++++
 .../runner/codec/impl/FlatBuffersEncoderTest.java      | 18 ++++++++++++++++++
 4 files changed, 52 insertions(+), 12 deletions(-)

diff --git 
a/runner-core/src/main/java/org/apache/apisix/plugin/runner/codec/impl/FlatBuffersDecoder.java
 
b/runner-core/src/main/java/org/apache/apisix/plugin/runner/codec/impl/FlatBuffersDecoder.java
index acbfac7..0e1d221 100644
--- 
a/runner-core/src/main/java/org/apache/apisix/plugin/runner/codec/impl/FlatBuffersDecoder.java
+++ 
b/runner-core/src/main/java/org/apache/apisix/plugin/runner/codec/impl/FlatBuffersDecoder.java
@@ -77,7 +77,7 @@ public class FlatBuffersDecoder implements 
PluginRunnerDecoder {
         for (int i = 0; i < 3; i++) {
             bytes[i] = payload.get();
         }
-        return byte3ToInt(bytes);
+        return bytes2Int(bytes, 0, 3);
     }
 
     private ByteBuffer getBody(ByteBuffer payload) throws 
BufferUnderflowException, IndexOutOfBoundsException {
@@ -89,9 +89,14 @@ public class FlatBuffersDecoder implements 
PluginRunnerDecoder {
         return buffer;
     }
 
-    private int byte3ToInt(byte[] bytes) {
-        return bytes[2] & 0xFF |
-                (bytes[1] & 0xFF << 8) |
-                (bytes[0] & 0xFF << 16);
+    int bytes2Int(byte[] b, int start, int len) {
+        int sum = 0;
+        int end = start + len;
+        for (int i = start; i < end; i++) {
+            int n = b[i] & 0xff;
+            n <<= (--len) * 8;
+            sum += n;
+        }
+        return sum;
     }
 }
diff --git 
a/runner-core/src/main/java/org/apache/apisix/plugin/runner/codec/impl/FlatBuffersEncoder.java
 
b/runner-core/src/main/java/org/apache/apisix/plugin/runner/codec/impl/FlatBuffersEncoder.java
index 5abde30..caead07 100644
--- 
a/runner-core/src/main/java/org/apache/apisix/plugin/runner/codec/impl/FlatBuffersEncoder.java
+++ 
b/runner-core/src/main/java/org/apache/apisix/plugin/runner/codec/impl/FlatBuffersEncoder.java
@@ -39,7 +39,7 @@ public class FlatBuffersEncoder implements 
PluginRunnerEncoder {
         ByteBuffer buffer = ByteBuffer.allocate(data.length + 4);
         buffer.put(type);
         // data length
-        byte[] length = intToByte3(data.length);
+        byte[] length = int2Bytes(data.length, 3);
         buffer.put(length);
         // data
         buffer.put(data);
@@ -47,11 +47,11 @@ public class FlatBuffersEncoder implements 
PluginRunnerEncoder {
         return buffer;
     }
 
-    private byte[] intToByte3(int i) {
-        byte[] targets = new byte[3];
-        targets[2] = (byte) (i & 0xFF);
-        targets[1] = (byte) (i >> 8 & 0xFF);
-        targets[0] = (byte) ((i >> 16 & 0xFF));
-        return targets;
+    byte[] int2Bytes(int value, int len) {
+        byte[] b = new byte[len];
+        for (int i = 0; i < len; i++) {
+            b[len - i - 1] = (byte) ((value >> 8 * i) & 0xff);
+        }
+        return b;
     }
 }
diff --git 
a/runner-core/src/test/java/org/apache/apisix/plugin/runner/codec/impl/FlatBuffersDecoderTest.java
 
b/runner-core/src/test/java/org/apache/apisix/plugin/runner/codec/impl/FlatBuffersDecoderTest.java
index ba6708d..829845b 100644
--- 
a/runner-core/src/test/java/org/apache/apisix/plugin/runner/codec/impl/FlatBuffersDecoderTest.java
+++ 
b/runner-core/src/test/java/org/apache/apisix/plugin/runner/codec/impl/FlatBuffersDecoderTest.java
@@ -20,6 +20,8 @@ package org.apache.apisix.plugin.runner.codec.impl;
 import com.google.flatbuffers.FlatBufferBuilder;
 import io.github.api7.A6.Err.Code;
 import io.github.api7.A6.TextEntry;
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
 import org.apache.apisix.plugin.runner.A6ConfigRequest;
 import org.apache.apisix.plugin.runner.A6ErrRequest;
 import org.apache.apisix.plugin.runner.A6Request;
@@ -158,4 +160,19 @@ class FlatBuffersDecoderTest {
         A6ConfigRequest configReq = (A6ConfigRequest) 
flatBuffersDecoder.decode(buffer);
         assertThrows(IndexOutOfBoundsException.class, () -> 
configReq.getReq().conf(0));
     }
+
+    @Test
+    @DisplayName("test decode data length greater then 256")
+    void testDecodeDataGreaterLargeThen256() {
+        byte[] bytes = new byte[]{0, 1, 4};
+        int length = flatBuffersDecoder.bytes2Int(bytes, 0, 3);
+
+        // use Bytebuf getInt function (default 4 bytes) to verify
+        ByteBuf buf = Unpooled.buffer(4);
+        byte[] bufBytes = {0, 0, 1, 4};
+        buf.writeBytes(bufBytes);
+        int bufLength = buf.getInt(0);
+
+        Assertions.assertEquals(length, bufLength);
+    }
 }
diff --git 
a/runner-core/src/test/java/org/apache/apisix/plugin/runner/codec/impl/FlatBuffersEncoderTest.java
 
b/runner-core/src/test/java/org/apache/apisix/plugin/runner/codec/impl/FlatBuffersEncoderTest.java
index ae07040..2d3ddbd 100644
--- 
a/runner-core/src/test/java/org/apache/apisix/plugin/runner/codec/impl/FlatBuffersEncoderTest.java
+++ 
b/runner-core/src/test/java/org/apache/apisix/plugin/runner/codec/impl/FlatBuffersEncoderTest.java
@@ -21,6 +21,8 @@ import io.github.api7.A6.Err.Code;
 import io.github.api7.A6.HTTPReqCall.Action;
 import io.github.api7.A6.HTTPReqCall.Rewrite;
 import io.github.api7.A6.HTTPReqCall.Stop;
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
 import org.apache.apisix.plugin.runner.A6ConfigResponse;
 import org.apache.apisix.plugin.runner.A6ErrResponse;
 import org.apache.apisix.plugin.runner.HttpResponse;
@@ -247,4 +249,20 @@ class FlatBuffersEncoderTest {
             }
         }
     }
+
+    @Test
+    @DisplayName("test encode data length greater then 256")
+    void testEncodeDataGreaterLargeThen256() {
+        byte[] bytes = flatBuffersEncoder.int2Bytes(260, 3);
+
+        // use Bytebuf getInt function (default 4 bytes) to verify
+        ByteBuf buf = Unpooled.buffer(4);
+        buf.setInt(0, 260);
+        byte[] array = buf.array();
+
+        Assertions.assertEquals(bytes[0], array[1]);
+        Assertions.assertEquals(bytes[1], array[2]);
+        Assertions.assertEquals(bytes[2], array[3]);
+
+    }
 }

Reply via email to