fix: convert the conf req to an object and put it in the cache (#73)

diff --git a/runner-core/src/main/java/org/apache/apisix/plugin/runner/handler/A6ConfigHandler.java b/runner-core/src/main/java/org/apache/apisix/plugin/runner/handler/A6ConfigHandler.java
index 9590a97..94c07cd 100644
--- a/runner-core/src/main/java/org/apache/apisix/plugin/runner/handler/A6ConfigHandler.java
+++ b/runner-core/src/main/java/org/apache/apisix/plugin/runner/handler/A6ConfigHandler.java
@@ -31,8 +31,8 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.nio.ByteBuffer;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -52,17 +52,20 @@
         Req req = ((A6ConfigRequest) request).getReq();
         long token = ((A6ConfigResponse) response).getConfToken();
         PluginFilterChain chain = createFilterChain(req);
-        ByteBuffer bb = req.getByteBuffer();
 
-        /**
-        * to reset vtable_start and vtable_size of req,
-        * so that req can be reused after being got from the cache.
-        * {@link org.apache.apisix.plugin.runner.handler.A6HttpCallHandler#handle cache.getIfPresent()}
-        * @see <a href="Issues63"> https://github.com/apache/apisix-java-plugin-runner/issues/63</a>
-        * */
-        req.__init(bb.getInt(bb.position()) + bb.position(), bb);
-        A6Conf config = new A6Conf(req, chain);
-        cache.put(token, config);
+        /*
+         * to reset vtable_start and vtable_size of req,
+         * so that req can be reused after being got from the cache.
+         * {@link org.apache.apisix.plugin.runner.handler.A6HttpCallHandler#handle cache.getIfPresent()}
+         * @see <a href="Issues63"> https://github.com/apache/apisix-java-plugin-runner/issues/63</a>
+         * */
+        Map<String, String> config = new HashMap<>();
+        for (int i = 0; i < req.confLength(); i++) {
+            TextEntry conf = req.conf(i);
+            config.put(conf.name(), conf.value());
+        }
+        A6Conf a6Conf = new A6Conf(config, chain);
+        cache.put(token, a6Conf);
     }
 
     private PluginFilterChain createFilterChain(Req req) {
diff --git a/runner-core/src/main/java/org/apache/apisix/plugin/runner/handler/A6HttpCallHandler.java b/runner-core/src/main/java/org/apache/apisix/plugin/runner/handler/A6HttpCallHandler.java
index 1b410ec..4f3ead4 100644
--- a/runner-core/src/main/java/org/apache/apisix/plugin/runner/handler/A6HttpCallHandler.java
+++ b/runner-core/src/main/java/org/apache/apisix/plugin/runner/handler/A6HttpCallHandler.java
@@ -52,7 +52,7 @@
             return;
         }
 
-        req.initCtx(rsp, conf.getReq());
+        req.initCtx(rsp, conf.getConfig());
         PluginFilterChain chain = conf.getChain();
         chain.filter(req, rsp);
     }
diff --git a/runner-core/src/test/java/org/apache/apisix/plugin/runner/handler/A6ConfigHandlerTest.java b/runner-core/src/test/java/org/apache/apisix/plugin/runner/handler/A6ConfigHandlerTest.java
index bcd9c5b..34792e8 100644
--- a/runner-core/src/test/java/org/apache/apisix/plugin/runner/handler/A6ConfigHandlerTest.java
+++ b/runner-core/src/test/java/org/apache/apisix/plugin/runner/handler/A6ConfigHandlerTest.java
@@ -100,7 +100,6 @@
         Assertions.assertEquals(config.getChain().getFilters().size(), 1);
         Assertions.assertEquals(config.getChain().getIndex(), 0);
         Assertions.assertEquals(config.get("FooFilter"), "Bar");
-
     }
 
     @Test
@@ -176,4 +175,28 @@
         A6Conf config = cache.getIfPresent(0L);
         Assertions.assertEquals(config.getChain().getFilters().size(), 0);
     }
+
+    @Test
+    @DisplayName("test fetch conf more times")
+    void testAddFilter5() {
+        FlatBufferBuilder builder = new FlatBufferBuilder();
+        int name = builder.createString("FooFilter");
+        int value = builder.createString("Bar");
+        int conf = TextEntry.createTextEntry(builder, name, value);
+        int confVector = Req.createConfVector(builder, new int[]{conf});
+        Req.startReq(builder);
+        Req.addConf(builder, confVector);
+        builder.finish(Req.endReq(builder));
+        Req req = Req.getRootAsReq(builder.dataBuffer());
+
+        A6ConfigRequest request = new A6ConfigRequest(req);
+        A6ConfigResponse response = new A6ConfigResponse(0L);
+        a6ConfigHandler.handle(request, response);
+
+        A6Conf a6Conf = cache.getIfPresent(0L);
+        Assertions.assertTrue(a6Conf.getConfig() instanceof HashMap);
+        for (int i = 0; i < 100; i++) {
+            Assertions.assertEquals(a6Conf.get("FooFilter"), "Bar");
+        }
+    }
 }
diff --git a/runner-plugin-sdk/src/main/java/org/apache/apisix/plugin/runner/A6Conf.java b/runner-plugin-sdk/src/main/java/org/apache/apisix/plugin/runner/A6Conf.java
index 42cc4de..288eada 100644
--- a/runner-plugin-sdk/src/main/java/org/apache/apisix/plugin/runner/A6Conf.java
+++ b/runner-plugin-sdk/src/main/java/org/apache/apisix/plugin/runner/A6Conf.java
@@ -17,17 +17,17 @@
 
 package org.apache.apisix.plugin.runner;
 
-import io.github.api7.A6.PrepareConf.Req;
-import io.github.api7.A6.TextEntry;
 import org.apache.apisix.plugin.runner.filter.PluginFilterChain;
 
+import java.util.Map;
+
 public class A6Conf {
 
-    public Req getReq() {
-        return req;
+    public Map<String, String> getConfig() {
+        return config;
     }
 
-    private final Req req;
+    private final Map<String, String> config;
 
     public PluginFilterChain getChain() {
         return chain;
@@ -35,18 +35,12 @@
 
     private final PluginFilterChain chain;
 
-    public A6Conf(Req req, PluginFilterChain chain) {
-        this.req = req;
+    public A6Conf(Map<String, String> config, PluginFilterChain chain) {
+        this.config = config;
         this.chain = chain;
     }
 
     public String get(String key) {
-        for (int i = 0; i < this.req.confLength(); i++) {
-            TextEntry conf = this.req.conf(i);
-            if (conf.name().equals(key)) {
-                return conf.value();
-            }
-        }
-        return null;
+        return config.getOrDefault(key, null);
     }
 }
diff --git a/runner-plugin-sdk/src/main/java/org/apache/apisix/plugin/runner/HttpRequest.java b/runner-plugin-sdk/src/main/java/org/apache/apisix/plugin/runner/HttpRequest.java
index c0d60b8..16c4881 100644
--- a/runner-plugin-sdk/src/main/java/org/apache/apisix/plugin/runner/HttpRequest.java
+++ b/runner-plugin-sdk/src/main/java/org/apache/apisix/plugin/runner/HttpRequest.java
@@ -33,7 +33,7 @@
 
     private HttpResponse response;
 
-    private io.github.api7.A6.PrepareConf.Req config;
+    private Map<String, String> config;
 
     private Long requestId;
 
@@ -58,13 +58,7 @@
      * @return the config
      */
     public String getConfig(PluginFilter filter) {
-        for (int i = 0; i < config.confLength(); i++) {
-            TextEntry conf = config.conf(i);
-            if (conf.name().equals(filter.name())) {
-                return conf.value();
-            }
-        }
-        return null;
+        return config.getOrDefault(filter.name(), null);
     }
 
     public long getRequestId() {
@@ -274,7 +268,7 @@
         return new HttpRequest(req);
     }
 
-    public void initCtx(HttpResponse response, io.github.api7.A6.PrepareConf.Req config) {
+    public void initCtx(HttpResponse response, Map<String, String> config) {
         this.response = response;
         this.config = config;
     }