You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shenyu.apache.org by da...@apache.org on 2022/10/09 03:21:14 UTC
[shenyu] branch master updated: [new: feature] not config rule (#4045)
This is an automated email from the ASF dual-hosted git repository.
daming 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 8e71100da [new: feature] not config rule (#4045)
8e71100da is described below
commit 8e71100da4d9e246283a9bc66370ed3acc95ab56
Author: xiaoyu <xi...@apache.org>
AuthorDate: Sun Oct 9 11:21:07 2022 +0800
[new: feature] not config rule (#4045)
* [new: feature] not config rule
---
.../shenyu/plugin/base/AbstractShenyuPlugin.java | 53 ++++++++++++++++------
.../apache/shenyu/plugin/cache/CachePlugin.java | 15 +++++-
.../shenyu/plugin/casdoor/CasdoorPlugin.java | 4 +-
.../plugin/context/path/ContextPathPlugin.java | 36 +++++++++------
.../plugin/context/path/ContextPathPluginTest.java | 1 +
.../apache/shenyu/plugin/divide/DividePlugin.java | 14 +++++-
.../plugin/springcloud/SpringCloudPlugin.java | 12 ++++-
.../org/apache/shenyu/plugin/waf/WafPlugin.java | 23 ++++++++--
.../shenyu/plugin/websocket/WebSocketPlugin.java | 18 ++++++--
9 files changed, 133 insertions(+), 43 deletions(-)
diff --git a/shenyu-plugin/shenyu-plugin-base/src/main/java/org/apache/shenyu/plugin/base/AbstractShenyuPlugin.java b/shenyu-plugin/shenyu-plugin-base/src/main/java/org/apache/shenyu/plugin/base/AbstractShenyuPlugin.java
index b8d518d6d..06488341d 100644
--- a/shenyu-plugin/shenyu-plugin-base/src/main/java/org/apache/shenyu/plugin/base/AbstractShenyuPlugin.java
+++ b/shenyu-plugin/shenyu-plugin-base/src/main/java/org/apache/shenyu/plugin/base/AbstractShenyuPlugin.java
@@ -18,6 +18,7 @@
package org.apache.shenyu.plugin.base;
import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair;
import org.apache.shenyu.common.config.ShenyuConfig;
import org.apache.shenyu.common.dto.ConditionData;
@@ -66,7 +67,7 @@ public abstract class AbstractShenyuPlugin implements ShenyuPlugin {
* @return {@code Mono<Void>} to indicate when request handling is complete
*/
protected abstract Mono<Void> doExecute(ServerWebExchange exchange, ShenyuPluginChain chain, SelectorData selector, RuleData rule);
-
+
/**
* Process the Web request and (optionally) delegate to the next
* {@code ShenyuPlugin} through the given {@link ShenyuPluginChain}.
@@ -90,15 +91,28 @@ public abstract class AbstractShenyuPlugin implements ShenyuPlugin {
}
Pair<Boolean, SelectorData> matchSelectorData = matchSelector(exchange, selectors);
selectorData = matchSelectorData.getRight();
- if (matchSelectorData.getLeft()) {
- cacheSelectorDataIfEnabled(path, selectorData);
+ if (Objects.isNull(selectorData)) {
+ if (matchCacheConfig.getEnabled() && matchSelectorData.getLeft()) {
+ selectorData = new SelectorData();
+ selectorData.setPluginName(named());
+ cacheSelectorData(path, selectorData);
+ }
+ return handleSelectorIfNull(pluginName, exchange, chain);
+ } else {
+ if (matchCacheConfig.getEnabled() && matchSelectorData.getLeft()) {
+ cacheSelectorData(path, selectorData);
+ }
+ }
+ } else {
+ if (StringUtils.isBlank(selectorData.getId())) {
+ return handleSelectorIfNull(pluginName, exchange, chain);
}
- }
- if (Objects.isNull(selectorData)) {
- return handleSelectorIfNull(pluginName, exchange, chain);
}
selectorLog(selectorData, pluginName);
-
+ if (Objects.nonNull(selectorData.getContinued()) && !selectorData.getContinued()) {
+ // if continued, not match rules
+ return doExecute(exchange, chain, selectorData, defaultRuleData(selectorData));
+ }
List<RuleData> rules = BaseDataCache.getInstance().obtainRuleData(selectorData.getId());
if (CollectionUtils.isEmpty(rules)) {
return handleRuleIfNull(pluginName, exchange, chain);
@@ -125,14 +139,16 @@ public abstract class AbstractShenyuPlugin implements ShenyuPlugin {
}
}
- private void cacheSelectorDataIfEnabled(final String path, final SelectorData selectorData) {
- if (matchCacheConfig.getEnabled() && Objects.nonNull(selectorData)) {
- List<ConditionData> conditionList = selectorData.getConditionList();
- if (CollectionUtils.isNotEmpty(conditionList)) {
- boolean isUriCondition = conditionList.stream().allMatch(v -> URI_CONDITION_TYPE.equals(v.getParamType()));
- if (isUriCondition) {
- MatchDataCache.getInstance().cacheSelectorData(path, selectorData, getMaxFreeMemory());
- }
+ private void cacheSelectorData(final String path, final SelectorData selectorData) {
+ if (StringUtils.isBlank(selectorData.getId())) {
+ MatchDataCache.getInstance().cacheSelectorData(path, selectorData, getMaxFreeMemory());
+ return;
+ }
+ List<ConditionData> conditionList = selectorData.getConditionList();
+ if (CollectionUtils.isNotEmpty(conditionList)) {
+ boolean isUriCondition = conditionList.stream().allMatch(v -> URI_CONDITION_TYPE.equals(v.getParamType()));
+ if (isUriCondition) {
+ MatchDataCache.getInstance().cacheSelectorData(path, selectorData, getMaxFreeMemory());
}
}
}
@@ -147,6 +163,13 @@ public abstract class AbstractShenyuPlugin implements ShenyuPlugin {
}
return null;
}
+
+ protected RuleData defaultRuleData(final SelectorData selectorData) {
+ RuleData ruleData = new RuleData();
+ ruleData.setSelectorId(selectorData.getId());
+ ruleData.setPluginName(selectorData.getPluginName());
+ return ruleData;
+ }
protected Mono<Void> handleSelectorIfNull(final String pluginName, final ServerWebExchange exchange, final ShenyuPluginChain chain) {
return chain.execute(exchange);
diff --git a/shenyu-plugin/shenyu-plugin-cache/shenyu-plugin-cache-handler/src/main/java/org/apache/shenyu/plugin/cache/CachePlugin.java b/shenyu-plugin/shenyu-plugin-cache/shenyu-plugin-cache-handler/src/main/java/org/apache/shenyu/plugin/cache/CachePlugin.java
index 3446a72f3..bf3f307ee 100644
--- a/shenyu-plugin/shenyu-plugin-cache/shenyu-plugin-cache-handler/src/main/java/org/apache/shenyu/plugin/cache/CachePlugin.java
+++ b/shenyu-plugin/shenyu-plugin-cache/shenyu-plugin-cache-handler/src/main/java/org/apache/shenyu/plugin/cache/CachePlugin.java
@@ -17,6 +17,7 @@
package org.apache.shenyu.plugin.cache;
+import org.apache.commons.lang3.StringUtils;
import org.apache.shenyu.common.dto.RuleData;
import org.apache.shenyu.common.dto.SelectorData;
import org.apache.shenyu.common.dto.convert.rule.impl.CacheRuleHandle;
@@ -43,6 +44,8 @@ import java.util.Optional;
* CacheWritePlugin.
*/
public class CachePlugin extends AbstractShenyuPlugin {
+
+ private final CacheRuleHandle defaultRuleHandle = new CacheRuleHandle();
@Override
public Mono<Void> doExecute(final ServerWebExchange exchange, final ShenyuPluginChain chain,
@@ -61,11 +64,11 @@ public class CachePlugin extends AbstractShenyuPlugin {
return exchange.getResponse().writeWith(Mono.just(exchange.getResponse().bufferFactory().wrap(bytes))
.doOnNext(data -> exchange.getResponse().getHeaders().setContentLength(data.readableByteCount())));
}
- CacheRuleHandle cacheRuleHandle = CachePluginDataHandler.CACHED_HANDLE.get().obtainHandle(CacheKeyUtils.INST.getKey(rule));
+ CacheRuleHandle cacheRuleHandle = buildRuleHandle(rule);
return chain.execute(exchange.mutate().response(new CacheHttpResponse(exchange, cacheRuleHandle)).build());
});
}
- CacheRuleHandle cacheRuleHandle = CachePluginDataHandler.CACHED_HANDLE.get().obtainHandle(CacheKeyUtils.INST.getKey(rule));
+ CacheRuleHandle cacheRuleHandle = buildRuleHandle(rule);
return chain.execute(exchange.mutate().response(new CacheHttpResponse(exchange, cacheRuleHandle)).build());
}
@@ -78,6 +81,14 @@ public class CachePlugin extends AbstractShenyuPlugin {
public String named() {
return PluginEnum.CACHE.getName();
}
+
+ private CacheRuleHandle buildRuleHandle(final RuleData rule) {
+ if (StringUtils.isNotEmpty(rule.getId())) {
+ return CachePluginDataHandler.CACHED_HANDLE.get().obtainHandle(CacheKeyUtils.INST.getKey(rule));
+ } else {
+ return defaultRuleHandle;
+ }
+ }
static class CacheHttpResponse extends ServerHttpResponseDecorator {
diff --git a/shenyu-plugin/shenyu-plugin-casdoor/src/main/java/org/apache/shenyu/plugin/casdoor/CasdoorPlugin.java b/shenyu-plugin/shenyu-plugin-casdoor/src/main/java/org/apache/shenyu/plugin/casdoor/CasdoorPlugin.java
index c3548e86d..7e0cbafb6 100644
--- a/shenyu-plugin/shenyu-plugin-casdoor/src/main/java/org/apache/shenyu/plugin/casdoor/CasdoorPlugin.java
+++ b/shenyu-plugin/shenyu-plugin-casdoor/src/main/java/org/apache/shenyu/plugin/casdoor/CasdoorPlugin.java
@@ -36,6 +36,9 @@ import reactor.core.publisher.Mono;
import java.util.Objects;
+/**
+ * The type Casdoor plugin.
+ */
public class CasdoorPlugin extends AbstractShenyuPlugin {
@Override
@@ -85,5 +88,4 @@ public class CasdoorPlugin extends AbstractShenyuPlugin {
mutate.header("organization", casdoorUser.getOwner());
return exchange.mutate().request(mutate.build()).build();
}
-
}
diff --git a/shenyu-plugin/shenyu-plugin-context-path/src/main/java/org/apache/shenyu/plugin/context/path/ContextPathPlugin.java b/shenyu-plugin/shenyu-plugin-context-path/src/main/java/org/apache/shenyu/plugin/context/path/ContextPathPlugin.java
index 4fd0b916d..0c19a3850 100644
--- a/shenyu-plugin/shenyu-plugin-context-path/src/main/java/org/apache/shenyu/plugin/context/path/ContextPathPlugin.java
+++ b/shenyu-plugin/shenyu-plugin-context-path/src/main/java/org/apache/shenyu/plugin/context/path/ContextPathPlugin.java
@@ -26,9 +26,6 @@ import org.apache.shenyu.common.enums.PluginEnum;
import org.apache.shenyu.common.enums.RpcTypeEnum;
import org.apache.shenyu.plugin.api.ShenyuPluginChain;
import org.apache.shenyu.plugin.api.context.ShenyuContext;
-import org.apache.shenyu.plugin.api.result.ShenyuResultEnum;
-import org.apache.shenyu.plugin.api.result.ShenyuResultWrap;
-import org.apache.shenyu.plugin.api.utils.WebFluxResultUtils;
import org.apache.shenyu.plugin.base.AbstractShenyuPlugin;
import org.apache.shenyu.plugin.base.utils.CacheKeyUtils;
import org.apache.shenyu.plugin.context.path.handler.ContextPathPluginDataHandler;
@@ -46,23 +43,24 @@ public class ContextPathPlugin extends AbstractShenyuPlugin {
private static final Logger LOG = LoggerFactory.getLogger(ContextPathPlugin.class);
+ private final ContextMappingRuleHandle defaultRuleHandle;
+
+ {
+ defaultRuleHandle = new ContextMappingRuleHandle();
+ defaultRuleHandle.setAddPrefixed(true);
+ defaultRuleHandle.setContextPath("/default");
+ }
+
@Override
protected Mono<Void> doExecute(final ServerWebExchange exchange, final ShenyuPluginChain chain, final SelectorData selector, final RuleData rule) {
ShenyuContext shenyuContext = exchange.getAttribute(Constants.CONTEXT);
assert shenyuContext != null;
- ContextMappingRuleHandle contextMappingRuleHandle = ContextPathPluginDataHandler.CACHED_HANDLE.get().obtainHandle(CacheKeyUtils.INST.getKey(rule));
- if (Objects.isNull(contextMappingRuleHandle)) {
+ ContextMappingRuleHandle ruleHandle = buildRuleHandle(rule);
+ if (Objects.isNull(ruleHandle)) {
LOG.error("context path rule configuration is null :{}", rule);
return chain.execute(exchange);
}
- String contextPath = contextMappingRuleHandle.getContextPath();
- if (StringUtils.isNoneBlank(contextPath) && !shenyuContext.getPath().startsWith(contextPath)) {
- LOG.error("the context path '{}' is invalid.", contextPath);
- Object error = ShenyuResultWrap.error(exchange, ShenyuResultEnum.CONTEXT_PATH_ERROR.getCode(),
- String.format("%s [invalid context path:'%s']", ShenyuResultEnum.CONTEXT_PATH_ERROR.getMsg(), contextPath), null);
- return WebFluxResultUtils.result(exchange, error);
- }
- buildContextPath(shenyuContext, contextMappingRuleHandle);
+ buildRealURI(shenyuContext, ruleHandle);
return chain.execute(exchange);
}
@@ -86,13 +84,21 @@ public class ContextPathPlugin extends AbstractShenyuPlugin {
RpcTypeEnum.SOFA);
}
+ private ContextMappingRuleHandle buildRuleHandle(final RuleData rule) {
+ if (StringUtils.isNotEmpty(rule.getId())) {
+ return ContextPathPluginDataHandler.CACHED_HANDLE.get().obtainHandle(CacheKeyUtils.INST.getKey(rule));
+ } else {
+ return defaultRuleHandle;
+ }
+ }
+
/**
- * Build the context path and realUrl.
+ * Build the realUrl.
*
* @param context context
* @param handle handle
*/
- private void buildContextPath(final ShenyuContext context, final ContextMappingRuleHandle handle) {
+ private void buildRealURI(final ShenyuContext context, final ContextMappingRuleHandle handle) {
String realURI = "";
String contextPath = handle.getContextPath();
if (StringUtils.isNoneBlank(contextPath)) {
diff --git a/shenyu-plugin/shenyu-plugin-context-path/src/test/java/org/apache/shenyu/plugin/context/path/ContextPathPluginTest.java b/shenyu-plugin/shenyu-plugin-context-path/src/test/java/org/apache/shenyu/plugin/context/path/ContextPathPluginTest.java
index 3ebd3459b..341d9924b 100644
--- a/shenyu-plugin/shenyu-plugin-context-path/src/test/java/org/apache/shenyu/plugin/context/path/ContextPathPluginTest.java
+++ b/shenyu-plugin/shenyu-plugin-context-path/src/test/java/org/apache/shenyu/plugin/context/path/ContextPathPluginTest.java
@@ -86,6 +86,7 @@ public final class ContextPathPluginTest {
shenyuContext.setPath("/http/context/order/findById");
ContextMappingRuleHandle contextMappingRuleHandle = new ContextMappingRuleHandle();
contextMappingRuleHandle.setContextPath("/http/context");
+ when(ruleData.getId()).thenReturn("1");
CACHED_HANDLE.get().cachedHandle(CacheKeyUtils.INST.getKey(ruleData), contextMappingRuleHandle);
when(ruleData.getHandle()).thenReturn(GsonUtils.getGson().toJson(contextMappingRuleHandle));
contextPathPlugin.doExecute(exchange, chain, selectorData, ruleData);
diff --git a/shenyu-plugin/shenyu-plugin-divide/src/main/java/org/apache/shenyu/plugin/divide/DividePlugin.java b/shenyu-plugin/shenyu-plugin-divide/src/main/java/org/apache/shenyu/plugin/divide/DividePlugin.java
index 1cd5e7b6f..7ead17ed9 100644
--- a/shenyu-plugin/shenyu-plugin-divide/src/main/java/org/apache/shenyu/plugin/divide/DividePlugin.java
+++ b/shenyu-plugin/shenyu-plugin-divide/src/main/java/org/apache/shenyu/plugin/divide/DividePlugin.java
@@ -54,12 +54,14 @@ import java.util.Objects;
public class DividePlugin extends AbstractShenyuPlugin {
private static final Logger LOG = LoggerFactory.getLogger(DividePlugin.class);
+
+ private final DivideRuleHandle defaultRuleHandle = new DivideRuleHandle();
@Override
protected Mono<Void> doExecute(final ServerWebExchange exchange, final ShenyuPluginChain chain, final SelectorData selector, final RuleData rule) {
ShenyuContext shenyuContext = exchange.getAttribute(Constants.CONTEXT);
assert shenyuContext != null;
- DivideRuleHandle ruleHandle = DividePluginDataHandler.CACHED_HANDLE.get().obtainHandle(CacheKeyUtils.INST.getKey(rule));
+ DivideRuleHandle ruleHandle = buildRuleHandle(rule);
if (ruleHandle.getHeaderMaxSize() > 0) {
long headerSize = exchange.getRequest().getHeaders().values()
.stream()
@@ -81,7 +83,7 @@ public class DividePlugin extends AbstractShenyuPlugin {
}
List<Upstream> upstreamList = UpstreamCacheManager.getInstance().findUpstreamListBySelectorId(selector.getId());
if (CollectionUtils.isEmpty(upstreamList)) {
- LOG.error("divide upstream configuration error: {}", rule);
+ LOG.error("divide upstream configuration error: {}", selector);
Object error = ShenyuResultWrap.error(exchange, ShenyuResultEnum.CANNOT_FIND_HEALTHY_UPSTREAM_URL);
return WebFluxResultUtils.result(exchange, error);
}
@@ -129,4 +131,12 @@ public class DividePlugin extends AbstractShenyuPlugin {
protected Mono<Void> handleRuleIfNull(final String pluginName, final ServerWebExchange exchange, final ShenyuPluginChain chain) {
return WebFluxResultUtils.noRuleResult(pluginName, exchange);
}
+
+ private DivideRuleHandle buildRuleHandle(final RuleData rule) {
+ if (StringUtils.isNotEmpty(rule.getId())) {
+ return DividePluginDataHandler.CACHED_HANDLE.get().obtainHandle(CacheKeyUtils.INST.getKey(rule));
+ } else {
+ return defaultRuleHandle;
+ }
+ }
}
diff --git a/shenyu-plugin/shenyu-plugin-springcloud/src/main/java/org/apache/shenyu/plugin/springcloud/SpringCloudPlugin.java b/shenyu-plugin/shenyu-plugin-springcloud/src/main/java/org/apache/shenyu/plugin/springcloud/SpringCloudPlugin.java
index 37c0d6e42..62163d0b0 100644
--- a/shenyu-plugin/shenyu-plugin-springcloud/src/main/java/org/apache/shenyu/plugin/springcloud/SpringCloudPlugin.java
+++ b/shenyu-plugin/shenyu-plugin-springcloud/src/main/java/org/apache/shenyu/plugin/springcloud/SpringCloudPlugin.java
@@ -47,6 +47,8 @@ import java.util.Objects;
public class SpringCloudPlugin extends AbstractShenyuPlugin {
private final ShenyuSpringCloudServiceChooser serviceChooser;
+
+ private final SpringCloudRuleHandle defaultRuleHandle = new SpringCloudRuleHandle();
/**
* Instantiates a new Spring cloud plugin.
@@ -66,7 +68,7 @@ public class SpringCloudPlugin extends AbstractShenyuPlugin {
final ShenyuContext shenyuContext = exchange.getAttribute(Constants.CONTEXT);
assert shenyuContext != null;
final SpringCloudSelectorHandle springCloudSelectorHandle = SpringCloudPluginDataHandler.SELECTOR_CACHED.get().obtainHandle(selector.getId());
- final SpringCloudRuleHandle ruleHandle = SpringCloudPluginDataHandler.RULE_CACHED.get().obtainHandle(CacheKeyUtils.INST.getKey(rule));
+ final SpringCloudRuleHandle ruleHandle = buildRuleHandle(rule);
String serviceId = springCloudSelectorHandle.getServiceId();
if (StringUtils.isBlank(serviceId)) {
Object error = ShenyuResultWrap.error(exchange, ShenyuResultEnum.CANNOT_CONFIG_SPRINGCLOUD_SERVICEID);
@@ -115,6 +117,14 @@ public class SpringCloudPlugin extends AbstractShenyuPlugin {
protected Mono<Void> handleRuleIfNull(final String pluginName, final ServerWebExchange exchange, final ShenyuPluginChain chain) {
return WebFluxResultUtils.noRuleResult(pluginName, exchange);
}
+
+ private SpringCloudRuleHandle buildRuleHandle(final RuleData rule) {
+ if (StringUtils.isNotEmpty(rule.getId())) {
+ return SpringCloudPluginDataHandler.RULE_CACHED.get().obtainHandle(CacheKeyUtils.INST.getKey(rule));
+ } else {
+ return defaultRuleHandle;
+ }
+ }
private void setDomain(final URI uri, final ServerWebExchange exchange) {
String domain = uri.getScheme() + "://" + uri.getAuthority();
diff --git a/shenyu-plugin/shenyu-plugin-waf/src/main/java/org/apache/shenyu/plugin/waf/WafPlugin.java b/shenyu-plugin/shenyu-plugin-waf/src/main/java/org/apache/shenyu/plugin/waf/WafPlugin.java
index 4437f858b..fe94b0c5b 100644
--- a/shenyu-plugin/shenyu-plugin-waf/src/main/java/org/apache/shenyu/plugin/waf/WafPlugin.java
+++ b/shenyu-plugin/shenyu-plugin-waf/src/main/java/org/apache/shenyu/plugin/waf/WafPlugin.java
@@ -25,12 +25,12 @@ import org.apache.shenyu.common.dto.convert.rule.WafHandle;
import org.apache.shenyu.common.enums.PluginEnum;
import org.apache.shenyu.common.enums.WafEnum;
import org.apache.shenyu.common.enums.WafModelEnum;
+import org.apache.shenyu.common.utils.Singleton;
import org.apache.shenyu.plugin.api.ShenyuPluginChain;
import org.apache.shenyu.plugin.api.result.ShenyuResultWrap;
import org.apache.shenyu.plugin.api.utils.WebFluxResultUtils;
import org.apache.shenyu.plugin.base.AbstractShenyuPlugin;
import org.apache.shenyu.plugin.base.utils.CacheKeyUtils;
-import org.apache.shenyu.common.utils.Singleton;
import org.apache.shenyu.plugin.waf.config.WafConfig;
import org.apache.shenyu.plugin.waf.handler.WafPluginDataHandler;
import org.slf4j.Logger;
@@ -47,6 +47,14 @@ import java.util.Objects;
public class WafPlugin extends AbstractShenyuPlugin {
private static final Logger LOG = LoggerFactory.getLogger(WafPlugin.class);
+
+ private final WafHandle defaultWafHandle;
+
+ {
+ defaultWafHandle = new WafHandle();
+ defaultWafHandle.setStatusCode(String.valueOf(HttpStatus.FORBIDDEN.value()));
+ defaultWafHandle.setPermission(WafEnum.REJECT.getName());
+ }
@Override
protected Mono<Void> doExecute(final ServerWebExchange exchange, final ShenyuPluginChain chain, final SelectorData selector, final RuleData rule) {
@@ -59,10 +67,9 @@ public class WafPlugin extends AbstractShenyuPlugin {
Object error = ShenyuResultWrap.error(exchange, HttpStatus.FORBIDDEN.value(), Constants.REJECT_MSG, null);
return WebFluxResultUtils.result(exchange, error);
}
- String handle = rule.getHandle();
- WafHandle wafHandle = WafPluginDataHandler.CACHED_HANDLE.get().obtainHandle(CacheKeyUtils.INST.getKey(rule));
+ WafHandle wafHandle = buildRuleHandle(rule);
if (Objects.isNull(wafHandle) || StringUtils.isBlank(wafHandle.getPermission())) {
- LOG.error("waf handler can not configuration:{}", handle);
+ LOG.error("waf handler can not configuration:{}", wafHandle);
return chain.execute(exchange);
}
if (WafEnum.REJECT.getName().equals(wafHandle.getPermission())) {
@@ -92,4 +99,12 @@ public class WafPlugin extends AbstractShenyuPlugin {
public int getOrder() {
return PluginEnum.WAF.getCode();
}
+
+ private WafHandle buildRuleHandle(final RuleData rule) {
+ if (StringUtils.isNotEmpty(rule.getId())) {
+ return WafPluginDataHandler.CACHED_HANDLE.get().obtainHandle(CacheKeyUtils.INST.getKey(rule));
+ } else {
+ return defaultWafHandle;
+ }
+ }
}
diff --git a/shenyu-plugin/shenyu-plugin-websocket/src/main/java/org/apache/shenyu/plugin/websocket/WebSocketPlugin.java b/shenyu-plugin/shenyu-plugin-websocket/src/main/java/org/apache/shenyu/plugin/websocket/WebSocketPlugin.java
index 4f2acd27c..772506096 100644
--- a/shenyu-plugin/shenyu-plugin-websocket/src/main/java/org/apache/shenyu/plugin/websocket/WebSocketPlugin.java
+++ b/shenyu-plugin/shenyu-plugin-websocket/src/main/java/org/apache/shenyu/plugin/websocket/WebSocketPlugin.java
@@ -22,10 +22,9 @@ import org.apache.commons.lang3.ObjectUtils;
import org.apache.shenyu.common.constant.Constants;
import org.apache.shenyu.common.dto.RuleData;
import org.apache.shenyu.common.dto.SelectorData;
-import org.apache.shenyu.common.dto.convert.rule.impl.DivideRuleHandle;
+import org.apache.shenyu.common.dto.convert.rule.impl.WebSocketRuleHandle;
import org.apache.shenyu.common.enums.PluginEnum;
import org.apache.shenyu.common.enums.RpcTypeEnum;
-import org.apache.shenyu.common.utils.GsonUtils;
import org.apache.shenyu.loadbalancer.cache.UpstreamCacheManager;
import org.apache.shenyu.loadbalancer.entity.Upstream;
import org.apache.shenyu.loadbalancer.factory.LoadBalancerFactory;
@@ -36,6 +35,8 @@ import org.apache.shenyu.plugin.api.result.ShenyuResultWrap;
import org.apache.shenyu.plugin.api.utils.RequestQueryCodecUtil;
import org.apache.shenyu.plugin.api.utils.WebFluxResultUtils;
import org.apache.shenyu.plugin.base.AbstractShenyuPlugin;
+import org.apache.shenyu.plugin.base.utils.CacheKeyUtils;
+import org.apache.shenyu.plugin.websocket.handler.WebSocketPluginDataHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpHeaders;
@@ -66,10 +67,13 @@ public class WebSocketPlugin extends AbstractShenyuPlugin {
private static final String SEC_WEB_SOCKET_PROTOCOL = "Sec-WebSocket-Protocol";
+ private final WebSocketRuleHandle defaultRuleHandle = new WebSocketRuleHandle();
+
private final WebSocketClient webSocketClient;
private final WebSocketService webSocketService;
+
/**
* Instantiates a new Web socket plugin.
*
@@ -89,7 +93,7 @@ public class WebSocketPlugin extends AbstractShenyuPlugin {
LOG.error("websocket upstream configuration error:{}", rule);
return chain.execute(exchange);
}
- final DivideRuleHandle ruleHandle = GsonUtils.getInstance().fromJson(rule.getHandle(), DivideRuleHandle.class);
+ final WebSocketRuleHandle ruleHandle = buildRuleHandle(rule);
final String ip = Objects.requireNonNull(exchange.getRequest().getRemoteAddress()).getAddress().getHostAddress();
Upstream upstream = LoadBalancerFactory.selector(upstreamList, ruleHandle.getLoadBalance(), ip);
if (Objects.isNull(upstream)) {
@@ -104,6 +108,14 @@ public class WebSocketPlugin extends AbstractShenyuPlugin {
wsRequestUrl, this.webSocketClient, filterHeaders(headers), buildWsProtocols(headers)));
}
+ private WebSocketRuleHandle buildRuleHandle(final RuleData rule) {
+ if (StringUtils.hasLength(rule.getId())) {
+ return WebSocketPluginDataHandler.CACHED_HANDLE.get().obtainHandle(CacheKeyUtils.INST.getKey(rule));
+ } else {
+ return defaultRuleHandle;
+ }
+ }
+
private String buildWsRealPath(final ServerWebExchange exchange, final Upstream upstream, final ShenyuContext shenyuContext) {
String protocol = upstream.getProtocol();
if (!StringUtils.hasLength(protocol)) {