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