You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shenyu.apache.org by xi...@apache.org on 2022/12/11 10:49:04 UTC
[shenyu] branch master updated: fix unused executing of plugin chain (#4254)
This is an automated email from the ASF dual-hosted git repository.
xiaoyu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shenyu.git
The following commit(s) were added to refs/heads/master by this push:
new 7761acaba fix unused executing of plugin chain (#4254)
7761acaba is described below
commit 7761acaba15b814146e178337476177ffda4b8ac
Author: 愿凌飞 <ti...@foxmail.com>
AuthorDate: Sun Dec 11 18:48:58 2022 +0800
fix unused executing of plugin chain (#4254)
---
.../org/apache/shenyu/plugin/sign/SignPlugin.java | 67 ++++++++++++----------
1 file changed, 36 insertions(+), 31 deletions(-)
diff --git a/shenyu-plugin/shenyu-plugin-sign/src/main/java/org/apache/shenyu/plugin/sign/SignPlugin.java b/shenyu-plugin/shenyu-plugin-sign/src/main/java/org/apache/shenyu/plugin/sign/SignPlugin.java
index f40247718..6d0bd9eea 100644
--- a/shenyu-plugin/shenyu-plugin-sign/src/main/java/org/apache/shenyu/plugin/sign/SignPlugin.java
+++ b/shenyu-plugin/shenyu-plugin-sign/src/main/java/org/apache/shenyu/plugin/sign/SignPlugin.java
@@ -62,7 +62,8 @@ public class SignPlugin extends AbstractShenyuPlugin {
/**
* Instantiates a new Sign plugin.
- * @param readers the sign use readers
+ *
+ * @param readers the sign use readers
* @param signService the sign service
*/
public SignPlugin(final List<HttpMessageReader<?>> readers, final SignService signService) {
@@ -81,46 +82,50 @@ public class SignPlugin extends AbstractShenyuPlugin {
}
@Override
- @SuppressWarnings("unchecked")
protected Mono<Void> doExecute(final ServerWebExchange exchange, final ShenyuPluginChain chain, final SelectorData selectorData, final RuleData rule) {
SignRuleHandler ruleHandler = SignPluginDataHandler.CACHED_HANDLE.get().obtainHandle(CacheKeyUtils.INST.getKey(rule));
- if (!ObjectUtils.isEmpty(ruleHandler) && ruleHandler.getSignRequestBody()) {
- ServerRequest serverRequest = ServerRequest.create(exchange, messageReaders);
- Mono<String> mono = serverRequest.bodyToMono(String.class)
- .switchIfEmpty(Mono.defer(() -> Mono.just("")))
- .flatMap(originalBody -> signBody(originalBody, exchange));
-
- BodyInserter<Mono<String>, ReactiveHttpOutputMessage> bodyInserter = BodyInserters.fromPublisher(mono, String.class);
- CachedBodyOutputMessage outputMessage = ResponseUtils.newCachedBodyOutputMessage(exchange);
- return bodyInserter.insert(outputMessage, new BodyInserterContext())
- .then(Mono.defer(() -> {
- ServerHttpRequestDecorator decorator = new SignRequestDecorator(exchange, outputMessage);
- return chain.execute(exchange.mutate().request(decorator).build());
- })).onErrorResume((Function<Throwable, Mono<Void>>) throwable -> ResponseUtils.release(outputMessage, throwable));
+ if (ObjectUtils.isEmpty(ruleHandler) || !ruleHandler.getSignRequestBody()) {
+ VerifyResult result = signService.signVerify(exchange);
+ if (result.isFailed()) {
+ return handleSignFailed(exchange, result.getReason());
+ }
+ return chain.execute(exchange);
}
- VerifyResult result = signService.signVerify(exchange);
- if (result.isFailed()) {
- Object error = ShenyuResultWrap.error(exchange, ShenyuResultEnum.SIGN_IS_NOT_PASS.getCode(), result.getReason(), null);
- return WebFluxResultUtils.result(exchange, error);
- }
-
- return chain.execute(exchange);
+ ServerRequest serverRequest = ServerRequest.create(exchange, messageReaders);
+ return serverRequest.bodyToMono(String.class)
+ .switchIfEmpty(Mono.defer(() -> Mono.just("")))
+ .flatMap(originalBody -> {
+ VerifyResult result = signBody(originalBody, exchange);
+ if (result.isSuccess()) {
+ return executeChain(originalBody, exchange, chain);
+ }
+ return handleSignFailed(exchange, result.getReason());
+ });
}
- @SuppressWarnings("rawtypes")
- private Mono signBody(final String originalBody, final ServerWebExchange exchange) {
+ private VerifyResult signBody(final String originalBody, final ServerWebExchange exchange) {
// get url params
MultiValueMap<String, String> queryParams = exchange.getRequest().getQueryParams();
// get post body
Map<String, Object> requestBody = StringUtils.isBlank(originalBody) ? null : JsonUtils.jsonToMap(originalBody);
Map<String, String> queryParamsSingleValueMap = queryParams.toSingleValueMap();
- VerifyResult result = signService.signVerify(exchange, requestBody, queryParamsSingleValueMap);
- if (result.isFailed()) {
- Object error = ShenyuResultWrap.error(exchange, ShenyuResultEnum.SIGN_IS_NOT_PASS.getCode(), result.getReason(), null);
- return WebFluxResultUtils.result(exchange, error);
- }
- // return original data
- return Mono.just(originalBody);
+ return signService.signVerify(exchange, requestBody, queryParamsSingleValueMap);
+ }
+
+ private Mono<Void> executeChain(final String requestBody, final ServerWebExchange exchange, final ShenyuPluginChain chain) {
+ BodyInserter<String, ReactiveHttpOutputMessage> bodyInserter = BodyInserters.fromValue(requestBody);
+ CachedBodyOutputMessage outputMessage = ResponseUtils.newCachedBodyOutputMessage(exchange);
+ return bodyInserter.insert(outputMessage, new BodyInserterContext())
+ .then(Mono.defer(() -> {
+ ServerHttpRequestDecorator decorator = new SignRequestDecorator(exchange, outputMessage);
+ return chain.execute(exchange.mutate().request(decorator).build());
+ }
+ )).onErrorResume((Function<Throwable, Mono<Void>>) throwable -> ResponseUtils.release(outputMessage, throwable));
+ }
+
+ private Mono<Void> handleSignFailed(final ServerWebExchange exchange, final String reason) {
+ Object error = ShenyuResultWrap.error(exchange, ShenyuResultEnum.SIGN_IS_NOT_PASS.getCode(), reason, null);
+ return WebFluxResultUtils.result(exchange, error);
}
}