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 88c0c26 test: add test cases about filter (#15)
88c0c26 is described below
commit 88c0c267f0593d7c8ce17533b2917f8768e99ad2
Author: tzssangglass <[email protected]>
AuthorDate: Thu May 27 20:32:40 2021 +0800
test: add test cases about filter (#15)
---
.../runner/codec/impl/FlatBuffersDecoder.java | 6 +-
.../plugin/runner/handler/A6ConfigHandler.java | 7 +-
.../runner/handler/A6HandlerConfiguration.java | 4 +-
.../plugin/runner/handler/A6HttpCallHandler.java | 2 +-
.../plugin/runner/handler/A6ConfigHandlerTest.java | 197 ++++++++++++++++
.../runner/handler/A6HttpCallHandlerTest.java | 251 +++++++++++++++++++++
.../apache/apisix/plugin/runner/HttpRequest.java | 2 +-
.../apache/apisix/plugin/runner/HttpResponse.java | 4 +
.../apisix/plugin/runner/filter/PluginFilter.java | 2 +
9 files changed, 466 insertions(+), 9 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 8b199e8..acbfac7 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
@@ -39,7 +39,7 @@ public class FlatBuffersDecoder implements
PluginRunnerDecoder {
try {
type = buffer.get();
} catch (BufferUnderflowException e) {
- logger.error("receive empty data");
+ logger.warn("receive empty data");
return new A6ErrRequest(Code.BAD_REQUEST);
}
@@ -51,7 +51,7 @@ public class FlatBuffersDecoder implements
PluginRunnerDecoder {
body = getBody(buffer);
a6ConfigRequest = A6ConfigRequest.from(body);
} catch (BufferUnderflowException | IndexOutOfBoundsException
e) {
- logger.error("receive error data length");
+ logger.warn("receive error data length");
return new A6ErrRequest(Code.BAD_REQUEST);
}
return a6ConfigRequest;
@@ -68,7 +68,7 @@ public class FlatBuffersDecoder implements
PluginRunnerDecoder {
break;
}
- logger.error("receive unsupported type: {}", type);
+ logger.warn("receive unsupported type: {}", type);
return new A6ErrRequest(Code.BAD_REQUEST);
}
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 7022363..c69e4b3 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
@@ -53,7 +53,6 @@ public class A6ConfigHandler implements Handler {
PluginFilterChain chain = createFilterChain(req);
A6Conf config = new A6Conf(req, chain);
cache.put(token, config);
-
}
private PluginFilterChain createFilterChain(Req req) {
@@ -62,7 +61,11 @@ public class A6ConfigHandler implements Handler {
TextEntry conf = req.conf(i);
PluginFilter filter = filters.get(conf.name());
if (Objects.isNull(filter)) {
- logger.error("receive undefined filter: {}, skip it",
conf.name());
+ logger.warn("receive undefined filter: {}, skip it",
conf.name());
+ continue;
+ }
+ if (chainFilters.contains(filter)) {
+ logger.warn("skip the same filter: {}", conf.name());
continue;
}
chainFilters.add(filter);
diff --git
a/runner-core/src/main/java/org/apache/apisix/plugin/runner/handler/A6HandlerConfiguration.java
b/runner-core/src/main/java/org/apache/apisix/plugin/runner/handler/A6HandlerConfiguration.java
index 9497e43..761400b 100644
---
a/runner-core/src/main/java/org/apache/apisix/plugin/runner/handler/A6HandlerConfiguration.java
+++
b/runner-core/src/main/java/org/apache/apisix/plugin/runner/handler/A6HandlerConfiguration.java
@@ -48,7 +48,7 @@ public class A6HandlerConfiguration {
List<PluginFilter> pluginFilterList =
beanProvider.orderedStream().collect(Collectors.toList());
Map<String, PluginFilter> filterMap = new HashMap<>();
for (PluginFilter filter : pluginFilterList) {
- filterMap.put(filter.getClass().getSimpleName(), filter);
+ filterMap.put(filter.name(), filter);
}
return new A6ConfigHandler(cache, filterMap);
}
@@ -76,7 +76,7 @@ public class A6HandlerConfiguration {
httpCallHandler.handle(request, response);
return response;
default:
- logger.error("can not dispatch type: {}",
request.getType());
+ logger.warn("can not dispatch type: {}",
request.getType());
response = new A6ErrResponse(Code.SERVICE_UNAVAILABLE);
return response;
}
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 8cb6523..1b410ec 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
@@ -46,7 +46,7 @@ public class A6HttpCallHandler implements Handler {
long confToken = ((HttpRequest) request).getConfToken();
A6Conf conf = cache.getIfPresent(confToken);
if (Objects.isNull(conf)) {
- logger.error("cannot find conf-token: {}", confToken);
+ logger.warn("cannot find conf token: {}", confToken);
A6ErrResponse errResponse = new
A6ErrResponse(Code.CONF_TOKEN_NOT_FOUND);
rsp.setErrResponse(errResponse);
return;
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
new file mode 100644
index 0000000..1f0d982
--- /dev/null
+++
b/runner-core/src/test/java/org/apache/apisix/plugin/runner/handler/A6ConfigHandlerTest.java
@@ -0,0 +1,197 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.apisix.plugin.runner.handler;
+
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheBuilder;
+import com.google.flatbuffers.FlatBufferBuilder;
+import io.github.api7.A6.PrepareConf.Req;
+import io.github.api7.A6.TextEntry;
+import org.apache.apisix.plugin.runner.A6Conf;
+import org.apache.apisix.plugin.runner.A6ConfigRequest;
+import org.apache.apisix.plugin.runner.A6ConfigResponse;
+import org.apache.apisix.plugin.runner.HttpRequest;
+import org.apache.apisix.plugin.runner.HttpResponse;
+import org.apache.apisix.plugin.runner.filter.PluginFilter;
+import org.apache.apisix.plugin.runner.filter.PluginFilterChain;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.boot.test.system.CapturedOutput;
+import org.springframework.boot.test.system.OutputCaptureExtension;
+import reactor.core.publisher.Mono;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+@ExtendWith(OutputCaptureExtension.class)
+@DisplayName("test add filter")
+class A6ConfigHandlerTest {
+
+ Cache<Long, A6Conf> cache;
+
+ Map<String, PluginFilter> filters;
+
+ A6ConfigHandler a6ConfigHandler;
+
+ @BeforeEach
+ void setUp() {
+ filters = new HashMap<>();
+ filters.put("FooFilter", new PluginFilter() {
+ @Override
+ public String name() {
+ return "FooFilter";
+ }
+
+ @Override
+ public Mono<Void> filter(HttpRequest request, HttpResponse
response, PluginFilterChain chain) {
+ return chain.filter(request, response);
+ }
+
+ @Override
+ public int getOrder() {
+ return 0;
+ }
+ });
+
+ filters.put("CatFilter", new PluginFilter() {
+ @Override
+ public String name() {
+ return "CatFilter";
+ }
+
+ @Override
+ public Mono<Void> filter(HttpRequest request, HttpResponse
response, PluginFilterChain chain) {
+ return chain.filter(request, response);
+ }
+
+ @Override
+ public int getOrder() {
+ return 1;
+ }
+ });
+ cache = CacheBuilder.newBuilder().expireAfterWrite(3600,
TimeUnit.SECONDS).maximumSize(1000).build();
+ a6ConfigHandler = new A6ConfigHandler(cache, filters);
+ }
+
+ @Test
+ @DisplayName("test add filter by prepare conf")
+ void testAddFilter1() {
+ 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 config = cache.getIfPresent(0L);
+ Assertions.assertNotNull(config.getChain());
+ Assertions.assertEquals(config.getChain().getFilters().size(), 1);
+
Assertions.assertEquals(config.getChain().getFilters().get(0).getOrder(), 0);
+ Assertions.assertEquals(config.get("FooFilter"), "Bar");
+
+ }
+
+ @Test
+ @DisplayName("test filter sort by it's order")
+ void testAddFilter2() {
+ FlatBufferBuilder builder = new FlatBufferBuilder();
+ int cat = builder.createString("CatFilter");
+ int dog = builder.createString("Dog");
+ int filter2 = TextEntry.createTextEntry(builder, cat, dog);
+
+ int foo = builder.createString("FooFilter");
+ int bar = builder.createString("Bar");
+ int filter1 = TextEntry.createTextEntry(builder, foo, bar);
+
+ int confVector = Req.createConfVector(builder, new int[]{filter1,
filter2});
+ 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 config = cache.getIfPresent(0L);
+ Assertions.assertEquals(config.getChain().getFilters().size(), 2);
+
Assertions.assertEquals(config.getChain().getFilters().get(0).getOrder(), 0);
+
Assertions.assertEquals(config.getChain().getFilters().get(1).getOrder(), 1);
+ }
+
+ @Test
+ @DisplayName("test skip the same name filter")
+ void testAddFilter3(CapturedOutput capturedOutput) {
+ FlatBufferBuilder builder = new FlatBufferBuilder();
+ int foo1 = builder.createString("FooFilter");
+ int bar1 = builder.createString("Bar1");
+ int filter1 = TextEntry.createTextEntry(builder, foo1, bar1);
+
+ int foo2 = builder.createString("FooFilter");
+ int bar2 = builder.createString("Bar2");
+ int filter2 = TextEntry.createTextEntry(builder, foo2, bar2);
+
+ int confVector = Req.createConfVector(builder, new int[]{filter1,
filter2});
+ 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 config = cache.getIfPresent(0L);
+ Assertions.assertEquals(config.getChain().getFilters().size(), 1);
+ Assertions.assertTrue(capturedOutput.getOut().contains("skip the same
filter: FooFilter"));
+ }
+
+ @Test
+ @DisplayName("test receive undefined filter")
+ void testAddFilter4(CapturedOutput capturedOutput) {
+ FlatBufferBuilder builder = new FlatBufferBuilder();
+ int foo = builder.createString("UndefinedFilter");
+ int bar = builder.createString("Bar");
+ int filter = TextEntry.createTextEntry(builder, foo, bar);
+
+ int confVector = Req.createConfVector(builder, new int[]{filter});
+ 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 config = cache.getIfPresent(0L);
+ Assertions.assertEquals(config.getChain().getFilters().size(), 0);
+ Assertions.assertTrue(capturedOutput.getOut().contains("receive
undefined filter: UndefinedFilter, skip it"));
+ }
+}
diff --git
a/runner-core/src/test/java/org/apache/apisix/plugin/runner/handler/A6HttpCallHandlerTest.java
b/runner-core/src/test/java/org/apache/apisix/plugin/runner/handler/A6HttpCallHandlerTest.java
new file mode 100644
index 0000000..e9604ec
--- /dev/null
+++
b/runner-core/src/test/java/org/apache/apisix/plugin/runner/handler/A6HttpCallHandlerTest.java
@@ -0,0 +1,251 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.apisix.plugin.runner.handler;
+
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheBuilder;
+import com.google.flatbuffers.FlatBufferBuilder;
+import io.github.api7.A6.Err.Code;
+import io.github.api7.A6.HTTPReqCall.Action;
+import io.github.api7.A6.TextEntry;
+import io.netty.handler.codec.http.HttpResponseStatus;
+import org.apache.apisix.plugin.runner.A6Conf;
+import org.apache.apisix.plugin.runner.A6ConfigRequest;
+import org.apache.apisix.plugin.runner.A6ConfigResponse;
+import org.apache.apisix.plugin.runner.HttpRequest;
+import org.apache.apisix.plugin.runner.HttpResponse;
+import org.apache.apisix.plugin.runner.filter.PluginFilter;
+import org.apache.apisix.plugin.runner.filter.PluginFilterChain;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.test.system.CapturedOutput;
+import org.springframework.boot.test.system.OutputCaptureExtension;
+import reactor.core.publisher.Mono;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.TimeUnit;
+
+@ExtendWith(OutputCaptureExtension.class)
+@DisplayName("test filter handle")
+class A6HttpCallHandlerTest {
+ private final Logger logger =
LoggerFactory.getLogger(A6HttpCallHandlerTest.class);
+
+ A6HttpCallHandler a6HttpCallHandler;
+
+ Cache<Long, A6Conf> cache;
+
+ Map<String, PluginFilter> filters;
+
+ @BeforeEach
+ void setUp() {
+ filters = new HashMap<>();
+ filters.put("FooFilter", new PluginFilter() {
+ @Override
+ public String name() {
+ return "FooFilter";
+ }
+
+ @Override
+ public Mono<Void> filter(HttpRequest request, HttpResponse
response, PluginFilterChain chain) {
+ logger.info("do filter: FooFilter, order: {}", getOrder());
+ logger.info("do filter: FooFilter, config: {}",
request.getConfig(this));
+
+ if (!Objects.isNull(request.getPath())) {
+ logger.info("do filter: path: {}", request.getPath());
+ }
+
+ if (!Objects.isNull(request.getArgs())) {
+ for (Map.Entry<String, String> arg :
request.getArgs().entrySet()) {
+ logger.info("do filter: arg key: {}", arg.getKey());
+ logger.info("do filter: arg value: {}",
arg.getValue());
+ }
+ }
+
+ if (!Objects.isNull(request.getHeaders())) {
+ for (Map.Entry<String, String> header :
request.getHeaders().entrySet()) {
+ logger.info("do filter: header key: {}",
header.getKey());
+ logger.info("do filter: header value: {}",
header.getValue());
+ }
+ }
+
+ if (!Objects.isNull(request.getMethod())) {
+ logger.info("do filter: method: {}", request.getMethod());
+ }
+
+ return chain.filter(request, response);
+ }
+
+ @Override
+ public int getOrder() {
+ return 0;
+ }
+ });
+
+ filters.put("CatFilter", new PluginFilter() {
+ @Override
+ public String name() {
+ return "CatFilter";
+ }
+
+ @Override
+ public Mono<Void> filter(HttpRequest request, HttpResponse
response, PluginFilterChain chain) {
+ logger.info("do filter: CatFilter, order: {}", getOrder());
+ logger.info("do filter: CatFilter, config: {}",
request.getConfig(this));
+
+ response.setStatus(HttpResponseStatus.UNAUTHORIZED);
+ return chain.filter(request, response);
+ }
+
+ @Override
+ public int getOrder() {
+ return 1;
+ }
+ });
+ cache = CacheBuilder.newBuilder().expireAfterWrite(3600,
TimeUnit.SECONDS).maximumSize(1000).build();
+ FlatBufferBuilder builder = new FlatBufferBuilder();
+ int cat = builder.createString("CatFilter");
+ int dog = builder.createString("Dog");
+ int filter2 = TextEntry.createTextEntry(builder, cat, dog);
+
+ int foo = builder.createString("FooFilter");
+ int bar = builder.createString("Bar");
+ int filter1 = TextEntry.createTextEntry(builder, foo, bar);
+
+ int confVector =
io.github.api7.A6.PrepareConf.Req.createConfVector(builder, new int[]{filter1,
filter2});
+ io.github.api7.A6.PrepareConf.Req.startReq(builder);
+ io.github.api7.A6.PrepareConf.Req.addConf(builder, confVector);
+ builder.finish(io.github.api7.A6.PrepareConf.Req.endReq(builder));
+ io.github.api7.A6.PrepareConf.Req req =
io.github.api7.A6.PrepareConf.Req.getRootAsReq(builder.dataBuffer());
+
+ A6ConfigRequest request = new A6ConfigRequest(req);
+ A6ConfigResponse response = new A6ConfigResponse(0L);
+
+ A6ConfigHandler a6ConfigHandler = new A6ConfigHandler(cache, filters);
+ a6ConfigHandler.handle(request, response);
+
+ a6HttpCallHandler = new A6HttpCallHandler(cache);
+ }
+
+ @Test
+ @DisplayName("test cannot find conf token")
+ void testCannotFindConfToken(CapturedOutput capturedOutput) {
+ FlatBufferBuilder builder = new FlatBufferBuilder();
+
+ io.github.api7.A6.HTTPReqCall.Req.startReq(builder);
+ io.github.api7.A6.HTTPReqCall.Req.addConfToken(builder, 9999L);
+ builder.finish(io.github.api7.A6.HTTPReqCall.Req.endReq(builder));
+
+ io.github.api7.A6.HTTPReqCall.Req req =
io.github.api7.A6.HTTPReqCall.Req.getRootAsReq(builder.dataBuffer());
+ HttpRequest request = new HttpRequest(req);
+ HttpResponse response = new HttpResponse(1L);
+ a6HttpCallHandler.handle(request, response);
+ Assertions.assertTrue(capturedOutput.getOut().contains("cannot find
conf token: 9999"));
+ io.github.api7.A6.Err.Resp err =
io.github.api7.A6.Err.Resp.getRootAsResp(response.getErrResponse().encode());
+ Assertions.assertEquals(err.code(), Code.CONF_TOKEN_NOT_FOUND);
+ }
+
+ @Test
+ @DisplayName("test do filter and get config")
+ void testDoFilter1(CapturedOutput capturedOutput) {
+ FlatBufferBuilder builder = new FlatBufferBuilder();
+
+ io.github.api7.A6.HTTPReqCall.Req.startReq(builder);
+ io.github.api7.A6.HTTPReqCall.Req.addConfToken(builder, 0L);
+ builder.finish(io.github.api7.A6.HTTPReqCall.Req.endReq(builder));
+
+ io.github.api7.A6.HTTPReqCall.Req req =
io.github.api7.A6.HTTPReqCall.Req.getRootAsReq(builder.dataBuffer());
+ HttpRequest request = new HttpRequest(req);
+ HttpResponse response = new HttpResponse(1L);
+ a6HttpCallHandler.handle(request, response);
+ Assertions.assertTrue(capturedOutput.getOut().contains("do filter:
FooFilter, order: 0"));
+ Assertions.assertTrue(capturedOutput.getOut().contains("do filter:
FooFilter, config: Bar"));
+ Assertions.assertTrue(capturedOutput.getOut().contains("do filter:
CatFilter, order: 1"));
+ Assertions.assertTrue(capturedOutput.getOut().contains("do filter:
CatFilter, config: Dog"));
+ }
+
+ @Test
+ @DisplayName("test get request params")
+ void testDoFilter2(CapturedOutput capturedOutput) {
+ FlatBufferBuilder builder = new FlatBufferBuilder();
+ int argKey = builder.createString("argKey");
+ int argValue = builder.createString("argValue");
+ int arg = TextEntry.createTextEntry(builder, argKey, argValue);
+ int argsVector =
io.github.api7.A6.HTTPReqCall.Req.createArgsVector(builder, new int[]{arg});
+
+ int headerKey = builder.createString("headerKey");
+ int headerValue = builder.createString("headerValue");
+
+ int header = TextEntry.createTextEntry(builder, headerKey,
headerValue);
+ int headerVector =
+ io.github.api7.A6.HTTPReqCall.Req.createHeadersVector(builder,
new int[]{header});
+
+ int path = builder.createString("/path");
+
+ io.github.api7.A6.HTTPReqCall.Req.startReq(builder);
+ io.github.api7.A6.HTTPReqCall.Req.addId(builder, 8888L);
+ io.github.api7.A6.HTTPReqCall.Req.addConfToken(builder, 0L);
+ io.github.api7.A6.HTTPReqCall.Req.addMethod(builder,
io.github.api7.A6.Method.GET);
+ io.github.api7.A6.HTTPReqCall.Req.addHeaders(builder, headerVector);
+ io.github.api7.A6.HTTPReqCall.Req.addPath(builder, path);
+ io.github.api7.A6.HTTPReqCall.Req.addArgs(builder, argsVector);
+ builder.finish(io.github.api7.A6.HTTPReqCall.Req.endReq(builder));
+ io.github.api7.A6.HTTPReqCall.Req req =
io.github.api7.A6.HTTPReqCall.Req.getRootAsReq(builder.dataBuffer());
+
+ HttpRequest request = new HttpRequest(req);
+ HttpResponse response = new HttpResponse(1L);
+ a6HttpCallHandler.handle(request, response);
+ Assertions.assertTrue(capturedOutput.getOut().contains("do filter:
FooFilter, order: 0"));
+ Assertions.assertTrue(capturedOutput.getOut().contains("do filter:
FooFilter, config: Bar"));
+
+ Assertions.assertTrue(capturedOutput.getOut().contains("do filter:
path: /path"));
+ Assertions.assertTrue(capturedOutput.getOut().contains("do filter: arg
key: argKey"));
+ Assertions.assertTrue(capturedOutput.getOut().contains("do filter: arg
value: argValue"));
+ Assertions.assertTrue(capturedOutput.getOut().contains("do filter:
header key: headerKey"));
+ Assertions.assertTrue(capturedOutput.getOut().contains("do filter:
header value: headerValue"));
+ Assertions.assertTrue(capturedOutput.getOut().contains("do filter:
method: GET"));
+
+ Assertions.assertTrue(capturedOutput.getOut().contains("do filter:
CatFilter, order: 1"));
+ Assertions.assertTrue(capturedOutput.getOut().contains("do filter:
CatFilter, config: Dog"));
+ }
+
+ @Test
+ @DisplayName("test stop the request")
+ void testDoFilter3() {
+ FlatBufferBuilder builder = new FlatBufferBuilder();
+
+ io.github.api7.A6.HTTPReqCall.Req.startReq(builder);
+ io.github.api7.A6.HTTPReqCall.Req.addConfToken(builder, 0L);
+ builder.finish(io.github.api7.A6.HTTPReqCall.Req.endReq(builder));
+
+ io.github.api7.A6.HTTPReqCall.Req req =
io.github.api7.A6.HTTPReqCall.Req.getRootAsReq(builder.dataBuffer());
+ HttpRequest request = new HttpRequest(req);
+ HttpResponse response = new HttpResponse(1L);
+ a6HttpCallHandler.handle(request, response);
+
+ io.github.api7.A6.HTTPReqCall.Resp resp =
+
io.github.api7.A6.HTTPReqCall.Resp.getRootAsResp(response.encode());
+ Assertions.assertEquals(resp.actionType(), Action.Stop);
+ }
+}
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 06440ef..1255507 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
@@ -54,7 +54,7 @@ public class HttpRequest implements A6Request {
public String getConfig(PluginFilter filter) {
for (int i = 0; i < config.confLength(); i++) {
TextEntry conf = config.conf(i);
- if (conf.name().equals(filter.getClass().getSimpleName())) {
+ if (conf.name().equals(filter.name())) {
return conf.value();
}
}
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 bee6636..651e8e0 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
@@ -109,6 +109,10 @@ public class HttpResponse implements A6Response {
this.errResponse = errResponse;
}
+ public A6ErrResponse getErrResponse() {
+ return this.errResponse;
+ }
+
@Override
public ByteBuffer encode() {
if (!Objects.isNull(errResponse)) {
diff --git
a/runner-plugin-sdk/src/main/java/org/apache/apisix/plugin/runner/filter/PluginFilter.java
b/runner-plugin-sdk/src/main/java/org/apache/apisix/plugin/runner/filter/PluginFilter.java
index a8a9b20..a7109a6 100644
---
a/runner-plugin-sdk/src/main/java/org/apache/apisix/plugin/runner/filter/PluginFilter.java
+++
b/runner-plugin-sdk/src/main/java/org/apache/apisix/plugin/runner/filter/PluginFilter.java
@@ -24,6 +24,8 @@ import reactor.core.publisher.Mono;
public interface PluginFilter extends Ordered {
+ String name();
+
Mono<Void> filter(HttpRequest request, HttpResponse response,
PluginFilterChain chain);
}