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;
}