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: 愿凌飞 <[email protected]>
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);
}
}