fix: set more headers and args (#30)

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 dbba24f..ae07040 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
@@ -168,4 +168,83 @@
         io.github.api7.A6.HTTPReqCall.Resp resp = io.github.api7.A6.HTTPReqCall.Resp.getRootAsResp(result);
         Assertions.assertEquals(resp.actionType(), Action.Stop);
     }
+
+    @Test
+    @DisplayName("test rewrite more headers and args")
+    void testRewriteMoreHeadersAndArgs() {
+        HttpResponse httpResponse = new HttpResponse(0L);
+        // set path, args, req header means rewrite request
+        httpResponse.setPath("/hello");
+        httpResponse.setArg("foo", "bar");
+        httpResponse.setArg("dog", "cat");
+        httpResponse.setArg("abc", "edf");
+        httpResponse.setReqHeader("Server", "APISIX");
+        httpResponse.setReqHeader("Authorization", "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c");
+        httpResponse.setReqHeader("Timestamp", "1623408133");
+
+        ByteBuffer result = flatBuffersEncoder.encode(httpResponse);
+        result.position(4);
+        io.github.api7.A6.HTTPReqCall.Resp resp = io.github.api7.A6.HTTPReqCall.Resp.getRootAsResp(result);
+        Assertions.assertEquals(resp.actionType(), Action.Rewrite);
+        Rewrite rewrite = (Rewrite) resp.action(new Rewrite());
+
+        Assertions.assertEquals(rewrite.path(), "/hello");
+        Assertions.assertEquals(rewrite.argsLength(), 3);
+        for (int i = 0; i < rewrite.argsLength(); i++) {
+            if (rewrite.args(i).name().equals("foo")) {
+                Assertions.assertEquals(rewrite.args(i).value(), "bar");
+            }
+            if (rewrite.args(i).name().equals("dog")) {
+                Assertions.assertEquals(rewrite.args(i).value(), "cat");
+            }
+            if (rewrite.args(i).name().equals("abc")) {
+                Assertions.assertEquals(rewrite.args(i).value(), "edf");
+            }
+        }
+
+        Assertions.assertEquals(rewrite.headersLength(), 3);
+        for (int i = 0; i < rewrite.headersLength(); i++) {
+            if (rewrite.headers(i).name().equals("Server")) {
+                Assertions.assertEquals(rewrite.headers(i).value(), "APISIX");
+            }
+        }
+        for (int i = 0; i < rewrite.headersLength(); i++) {
+            if (rewrite.headers(i).name().equals("Authorization")) {
+                Assertions.assertEquals(rewrite.headers(i).value(), "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c");
+            }
+        }
+        for (int i = 0; i < rewrite.headersLength(); i++) {
+            if (rewrite.headers(i).name().equals("Timestamp")) {
+                Assertions.assertEquals(rewrite.headers(i).value(), "1623408133");
+            }
+        }
+    }
+
+    @Test
+    @DisplayName("test set more stop headers")
+    void testSetMoreStopHeaders() {
+        HttpResponse httpResponse = new HttpResponse(0L);
+        // set status, body, resp header means stop request
+        httpResponse.setHeader("Server", "APISIX");
+        httpResponse.setHeader("Error", "Unauthorized");
+        httpResponse.setHeader("Timestamp", "1623408133");
+        ByteBuffer result = flatBuffersEncoder.encode(httpResponse);
+        result.position(4);
+        io.github.api7.A6.HTTPReqCall.Resp resp = io.github.api7.A6.HTTPReqCall.Resp.getRootAsResp(result);
+        Assertions.assertEquals(resp.actionType(), Action.Stop);
+        Stop stop = (Stop) resp.action(new Stop());
+
+        Assertions.assertEquals(stop.headersLength(), 3);
+        for (int i = 0; i < stop.headersLength(); i++) {
+            if (stop.headers(i).name().equals("Server")) {
+                Assertions.assertEquals(stop.headers(i).value(), "APISIX");
+            }
+            if (stop.headers(i).name().equals("Error")) {
+                Assertions.assertEquals(stop.headers(i).value(), "Unauthorized");
+            }
+            if (stop.headers(i).name().equals("Timestamp")) {
+                Assertions.assertEquals(stop.headers(i).value(), "1623408133");
+            }
+        }
+    }
 }
diff --git a/runner-plugin-sdk/src/main/java/org/apache/apisix/plugin/runner/HttpResponse.java b/runner-plugin-sdk/src/main/java/org/apache/apisix/plugin/runner/HttpResponse.java
index 52eaa64..1f0a876 100644
--- a/runner-plugin-sdk/src/main/java/org/apache/apisix/plugin/runner/HttpResponse.java
+++ b/runner-plugin-sdk/src/main/java/org/apache/apisix/plugin/runner/HttpResponse.java
@@ -172,10 +172,13 @@
         int headerIndex = -1;
         if (!CollectionUtils.isEmpty(respHeaders)) {
             int[] headerTexts = new int[respHeaders.size()];
+            int i = -1;
             for (Map.Entry<String, String> header : respHeaders.entrySet()) {
-                int i = -1;
                 int key = builder.createString(header.getKey());
-                int value = builder.createString(header.getValue());
+                int value = 0;
+                if (!Objects.isNull(header.getValue())) {
+                    value = builder.createString(header.getValue());
+                }
                 int text = TextEntry.createTextEntry(builder, key, value);
                 headerTexts[++i] = text;
             }
@@ -210,19 +213,14 @@
         int headerIndex = -1;
         if (!CollectionUtils.isEmpty(reqHeaders)) {
             int[] headerTexts = new int[reqHeaders.size()];
+            int i = -1;
             for (Map.Entry<String, String> header : reqHeaders.entrySet()) {
-                int i = -1;
                 int key = builder.createString(header.getKey());
                 int value = 0;
                 if (!Objects.isNull(header.getValue())) {
                     value = builder.createString(header.getValue());
                 }
-                TextEntry.startTextEntry(builder);
-                TextEntry.addName(builder, key);
-                if (!Objects.isNull(header.getValue())) {
-                    TextEntry.addValue(builder, value);
-                }
-                int text = TextEntry.endTextEntry(builder);
+                int text = TextEntry.createTextEntry(builder, key, value);
                 headerTexts[++i] = text;
             }
             headerIndex = Rewrite.createHeadersVector(builder, headerTexts);
@@ -231,19 +229,14 @@
         int argsIndex = -1;
         if (!CollectionUtils.isEmpty(args)) {
             int[] argTexts = new int[args.size()];
+            int i = -1;
             for (Map.Entry<String, String> arg : args.entrySet()) {
-                int i = -1;
                 int key = builder.createString(arg.getKey());
                 int value = 0;
                 if (!Objects.isNull(arg.getValue())) {
                     value = builder.createString(arg.getValue());
                 }
-                TextEntry.startTextEntry(builder);
-                TextEntry.addName(builder, key);
-                if (!Objects.isNull(arg.getValue())) {
-                    TextEntry.addValue(builder, value);
-                }
-                int text = TextEntry.endTextEntry(builder);
+                int text = TextEntry.createTextEntry(builder, key, value);
                 argTexts[++i] = text;
             }
             argsIndex = Rewrite.createArgsVector(builder, argTexts);