This is an automated email from the ASF dual-hosted git repository.
Aias00 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 0423556a3a fix(plugin): evict cached rule handles when explicitly
cleared. (#7794)
0423556a3a is described below
commit 0423556a3a44709157c9be9f6a7c04a3b05bda48
Author: ChengJie Liao <[email protected]>
AuthorDate: Mon Oct 19 09:27:40 2026 +0800
fix(plugin): evict cached rule handles when explicitly cleared. (#7794)
Remove cached handles for explicit empty or whitespace-only rule updates
in the request, rewrite, modify-response, and param-mapping handlers.
Preserve null updates and normal JSON parsing.
Add handler regression coverage and verify that a cleared request rule
stops modifying headers, query parameters, and cookies.
Fixes #7759
Co-authored-by: ChengJie Liao
<[email protected]>
---
.../handler/ModifyResponsePluginDataHandler.java | 5 +++
.../ModifyResponsePluginDataHandlerTest.java | 45 +++++++++++++++++++
.../handler/ParamMappingPluginDataHandler.java | 5 +++
.../handler/ParamMappingPluginDataTest.java | 41 +++++++++++++++++
.../request/handler/RequestPluginHandler.java | 5 +++
.../shenyu/plugin/request/RequestPluginTest.java | 21 +++++++++
.../request/handler/RequestPluginHandlerTest.java | 43 ++++++++++++++++++
.../rewrite/handler/RewritePluginDataHandler.java | 5 +++
.../handler/RewritePluginDataHandlerTest.java | 51 ++++++++++++++++++++++
9 files changed, 221 insertions(+)
diff --git
a/shenyu-plugin/shenyu-plugin-modify-response/src/main/java/org/apache/shenyu/plugin/modify/response/handler/ModifyResponsePluginDataHandler.java
b/shenyu-plugin/shenyu-plugin-modify-response/src/main/java/org/apache/shenyu/plugin/modify/response/handler/ModifyResponsePluginDataHandler.java
index 10177df6ff..3beb024523 100644
---
a/shenyu-plugin/shenyu-plugin-modify-response/src/main/java/org/apache/shenyu/plugin/modify/response/handler/ModifyResponsePluginDataHandler.java
+++
b/shenyu-plugin/shenyu-plugin-modify-response/src/main/java/org/apache/shenyu/plugin/modify/response/handler/ModifyResponsePluginDataHandler.java
@@ -17,6 +17,7 @@
package org.apache.shenyu.plugin.modify.response.handler;
+import org.apache.commons.lang3.StringUtils;
import org.apache.shenyu.common.dto.RuleData;
import org.apache.shenyu.common.dto.convert.rule.impl.ModifyResponseRuleHandle;
import org.apache.shenyu.common.enums.PluginEnum;
@@ -39,6 +40,10 @@ public class ModifyResponsePluginDataHandler implements
PluginDataHandler {
@Override
public void handlerRule(final RuleData ruleData) {
Optional.ofNullable(ruleData.getHandle()).ifPresent(s -> {
+ if (StringUtils.isBlank(s)) {
+ removeRule(ruleData);
+ return;
+ }
final ModifyResponseRuleHandle modifyResponseRuleHandle =
GsonUtils.getInstance().fromJson(s, ModifyResponseRuleHandle.class);
CACHED_HANDLE.get().cachedHandle(CacheKeyUtils.INST.getKey(ruleData),
modifyResponseRuleHandle);
});
diff --git
a/shenyu-plugin/shenyu-plugin-modify-response/src/test/java/org/apache/shenyu/plugin/modify/response/handler/ModifyResponsePluginDataHandlerTest.java
b/shenyu-plugin/shenyu-plugin-modify-response/src/test/java/org/apache/shenyu/plugin/modify/response/handler/ModifyResponsePluginDataHandlerTest.java
index 1ab505c652..e91494cf4f 100644
---
a/shenyu-plugin/shenyu-plugin-modify-response/src/test/java/org/apache/shenyu/plugin/modify/response/handler/ModifyResponsePluginDataHandlerTest.java
+++
b/shenyu-plugin/shenyu-plugin-modify-response/src/test/java/org/apache/shenyu/plugin/modify/response/handler/ModifyResponsePluginDataHandlerTest.java
@@ -24,9 +24,14 @@ import org.apache.shenyu.common.utils.GsonUtils;
import org.apache.shenyu.plugin.base.utils.CacheKeyUtils;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.EmptySource;
+import org.junit.jupiter.params.provider.ValueSource;
import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertSame;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -79,4 +84,44 @@ public final class ModifyResponsePluginDataHandlerTest {
public void pluginNamedTest() {
assertEquals(modifyResponsePluginDataHandler.pluginNamed(),
PluginEnum.MODIFY_RESPONSE.getName());
}
+
+ @ParameterizedTest
+ @EmptySource
+ @ValueSource(strings = {" ", "\t\r\n"})
+ public void testBlankHandleClearsCachedRule(final String handle) {
+ modifyResponsePluginDataHandler.handlerRule(ruleData);
+ String key = CacheKeyUtils.INST.getKey(ruleData);
+
assertNotNull(ModifyResponsePluginDataHandler.CACHED_HANDLE.get().obtainHandle(key));
+
+ when(ruleData.getHandle()).thenReturn(handle);
+ modifyResponsePluginDataHandler.handlerRule(ruleData);
+
assertNull(ModifyResponsePluginDataHandler.CACHED_HANDLE.get().obtainHandle(key));
+
+ modifyResponsePluginDataHandler.handlerRule(ruleData);
+
assertNull(ModifyResponsePluginDataHandler.CACHED_HANDLE.get().obtainHandle(key));
+ }
+
+ @Test
+ public void testNullHandleRetainsCachedRule() {
+ modifyResponsePluginDataHandler.handlerRule(ruleData);
+ String key = CacheKeyUtils.INST.getKey(ruleData);
+ ModifyResponseRuleHandle cached =
ModifyResponsePluginDataHandler.CACHED_HANDLE.get().obtainHandle(key);
+
+ when(ruleData.getHandle()).thenReturn(null);
+ modifyResponsePluginDataHandler.handlerRule(ruleData);
+
+ assertSame(cached,
ModifyResponsePluginDataHandler.CACHED_HANDLE.get().obtainHandle(key));
+ }
+
+ @Test
+ public void testEmptyObjectReplacesCachedRule() {
+ modifyResponsePluginDataHandler.handlerRule(ruleData);
+ when(ruleData.getHandle()).thenReturn("{}");
+
+ modifyResponsePluginDataHandler.handlerRule(ruleData);
+
+ ModifyResponseRuleHandle cached =
ModifyResponsePluginDataHandler.CACHED_HANDLE.get().obtainHandle(CacheKeyUtils.INST.getKey(ruleData));
+ assertNotNull(cached);
+ assertEquals(0, cached.getStatusCode());
+ }
}
diff --git
a/shenyu-plugin/shenyu-plugin-param-mapping/src/main/java/org/apache/shenyu/plugin/param/mapping/handler/ParamMappingPluginDataHandler.java
b/shenyu-plugin/shenyu-plugin-param-mapping/src/main/java/org/apache/shenyu/plugin/param/mapping/handler/ParamMappingPluginDataHandler.java
index 666b1671f7..ddcb8c8d63 100644
---
a/shenyu-plugin/shenyu-plugin-param-mapping/src/main/java/org/apache/shenyu/plugin/param/mapping/handler/ParamMappingPluginDataHandler.java
+++
b/shenyu-plugin/shenyu-plugin-param-mapping/src/main/java/org/apache/shenyu/plugin/param/mapping/handler/ParamMappingPluginDataHandler.java
@@ -17,6 +17,7 @@
package org.apache.shenyu.plugin.param.mapping.handler;
+import org.apache.commons.lang3.StringUtils;
import org.apache.shenyu.common.dto.RuleData;
import org.apache.shenyu.common.dto.convert.rule.impl.ParamMappingRuleHandle;
import org.apache.shenyu.common.enums.PluginEnum;
@@ -39,6 +40,10 @@ public class ParamMappingPluginDataHandler implements
PluginDataHandler {
@Override
public void handlerRule(final RuleData ruleData) {
Optional.ofNullable(ruleData.getHandle()).ifPresent(s -> {
+ if (StringUtils.isBlank(s)) {
+ removeRule(ruleData);
+ return;
+ }
ParamMappingRuleHandle paramMappingRuleHandle =
GsonUtils.getInstance().fromJson(s, ParamMappingRuleHandle.class);
CACHED_HANDLE.get().cachedHandle(CacheKeyUtils.INST.getKey(ruleData),
paramMappingRuleHandle);
});
diff --git
a/shenyu-plugin/shenyu-plugin-param-mapping/src/test/java/org/apache/shenyu/plugin/param/mapping/handler/ParamMappingPluginDataTest.java
b/shenyu-plugin/shenyu-plugin-param-mapping/src/test/java/org/apache/shenyu/plugin/param/mapping/handler/ParamMappingPluginDataTest.java
index fb93c29a6e..0a7c5485d5 100644
---
a/shenyu-plugin/shenyu-plugin-param-mapping/src/test/java/org/apache/shenyu/plugin/param/mapping/handler/ParamMappingPluginDataTest.java
+++
b/shenyu-plugin/shenyu-plugin-param-mapping/src/test/java/org/apache/shenyu/plugin/param/mapping/handler/ParamMappingPluginDataTest.java
@@ -23,6 +23,9 @@ import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.EmptySource;
+import org.junit.jupiter.params.provider.ValueSource;
import org.mockito.junit.jupiter.MockitoExtension;
/**
@@ -67,4 +70,42 @@ public class ParamMappingPluginDataTest {
public void testPluginNamed() {
Assertions.assertEquals(this.paramMappingPluginDataHandler.pluginNamed(),
"paramMapping");
}
+
+ @ParameterizedTest
+ @EmptySource
+ @ValueSource(strings = {" ", "\t\r\n"})
+ public void testBlankHandleClearsCachedRule(final String handle) {
+ paramMappingPluginDataHandler.handlerRule(ruleData);
+ String key = CacheKeyUtils.INST.getKey(ruleData);
+
Assertions.assertNotNull(ParamMappingPluginDataHandler.CACHED_HANDLE.get().obtainHandle(key));
+
+ ruleData.setHandle(handle);
+ paramMappingPluginDataHandler.handlerRule(ruleData);
+
Assertions.assertNull(ParamMappingPluginDataHandler.CACHED_HANDLE.get().obtainHandle(key));
+
+ paramMappingPluginDataHandler.handlerRule(ruleData);
+
Assertions.assertNull(ParamMappingPluginDataHandler.CACHED_HANDLE.get().obtainHandle(key));
+ }
+
+ @Test
+ public void testNullHandleRetainsCachedRule() {
+ paramMappingPluginDataHandler.handlerRule(ruleData);
+ String key = CacheKeyUtils.INST.getKey(ruleData);
+ Object cached =
ParamMappingPluginDataHandler.CACHED_HANDLE.get().obtainHandle(key);
+
+ ruleData.setHandle(null);
+ paramMappingPluginDataHandler.handlerRule(ruleData);
+
+ Assertions.assertSame(cached,
ParamMappingPluginDataHandler.CACHED_HANDLE.get().obtainHandle(key));
+ }
+
+ @Test
+ public void testEmptyObjectReplacesCachedRule() {
+ paramMappingPluginDataHandler.handlerRule(ruleData);
+ ruleData.setHandle("{}");
+
+ paramMappingPluginDataHandler.handlerRule(ruleData);
+
+
Assertions.assertNull(ParamMappingPluginDataHandler.CACHED_HANDLE.get().obtainHandle(CacheKeyUtils.INST.getKey(ruleData)).getAddParameterKeys());
+ }
}
diff --git
a/shenyu-plugin/shenyu-plugin-request/src/main/java/org/apache/shenyu/plugin/request/handler/RequestPluginHandler.java
b/shenyu-plugin/shenyu-plugin-request/src/main/java/org/apache/shenyu/plugin/request/handler/RequestPluginHandler.java
index ed3d94a7f7..673d88a254 100644
---
a/shenyu-plugin/shenyu-plugin-request/src/main/java/org/apache/shenyu/plugin/request/handler/RequestPluginHandler.java
+++
b/shenyu-plugin/shenyu-plugin-request/src/main/java/org/apache/shenyu/plugin/request/handler/RequestPluginHandler.java
@@ -17,6 +17,7 @@
package org.apache.shenyu.plugin.request.handler;
+import org.apache.commons.lang3.StringUtils;
import org.apache.shenyu.common.dto.RuleData;
import org.apache.shenyu.common.dto.convert.rule.RequestHandle;
import org.apache.shenyu.common.enums.PluginEnum;
@@ -39,6 +40,10 @@ public class RequestPluginHandler implements
PluginDataHandler {
@Override
public void handlerRule(final RuleData ruleData) {
Optional.ofNullable(ruleData.getHandle()).ifPresent(s -> {
+ if (StringUtils.isBlank(s)) {
+ removeRule(ruleData);
+ return;
+ }
RequestHandle requestHandle = GsonUtils.getInstance().fromJson(s,
RequestHandle.class);
CACHED_HANDLE.get().cachedHandle(CacheKeyUtils.INST.getKey(ruleData),
requestHandle);
});
diff --git
a/shenyu-plugin/shenyu-plugin-request/src/test/java/org/apache/shenyu/plugin/request/RequestPluginTest.java
b/shenyu-plugin/shenyu-plugin-request/src/test/java/org/apache/shenyu/plugin/request/RequestPluginTest.java
index 199f68331b..8608a17c4a 100644
---
a/shenyu-plugin/shenyu-plugin-request/src/test/java/org/apache/shenyu/plugin/request/RequestPluginTest.java
+++
b/shenyu-plugin/shenyu-plugin-request/src/test/java/org/apache/shenyu/plugin/request/RequestPluginTest.java
@@ -36,6 +36,9 @@ import
org.apache.shenyu.plugin.request.handler.RequestPluginHandler;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.EmptySource;
+import org.junit.jupiter.params.provider.ValueSource;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.Mockito;
@@ -136,6 +139,24 @@ public class RequestPluginTest {
assertEquals("oldValue",
captor.getValue().getRequest().getHeaders().getFirst("addKey"));
}
+ @ParameterizedTest
+ @EmptySource
+ @ValueSource(strings = {" ", "\t\r\n"})
+ public void testClearedRuleStopsRequestTransformations(final String
handle) {
+ ruleData.setHandle(handle);
+ new RequestPluginHandler().handlerRule(ruleData);
+ when(chain.execute(any())).thenReturn(Mono.empty());
+
+ StepVerifier.create(requestPlugin.doExecute(exchange, chain, new
SelectorData(), ruleData)).verifyComplete();
+
+ ArgumentCaptor<ServerWebExchange> captor =
ArgumentCaptor.forClass(ServerWebExchange.class);
+ Mockito.verify(chain).execute(captor.capture());
+ ServerHttpRequest request = captor.getValue().getRequest();
+ assertEquals(exchange.getRequest().getHeaders(), request.getHeaders());
+ assertEquals(exchange.getRequest().getQueryParams(),
request.getQueryParams());
+ assertEquals(exchange.getRequest().getCookies(), request.getCookies());
+ }
+
@Test
public void testCookieOnlyRule() {
ruleData.setHandle("{\"cookie\":{\"addCookies\":{\"partial\":\"value\"}}}");
diff --git
a/shenyu-plugin/shenyu-plugin-request/src/test/java/org/apache/shenyu/plugin/request/handler/RequestPluginHandlerTest.java
b/shenyu-plugin/shenyu-plugin-request/src/test/java/org/apache/shenyu/plugin/request/handler/RequestPluginHandlerTest.java
index 010beff947..8f958a7408 100644
---
a/shenyu-plugin/shenyu-plugin-request/src/test/java/org/apache/shenyu/plugin/request/handler/RequestPluginHandlerTest.java
+++
b/shenyu-plugin/shenyu-plugin-request/src/test/java/org/apache/shenyu/plugin/request/handler/RequestPluginHandlerTest.java
@@ -22,11 +22,16 @@ import org.apache.shenyu.plugin.base.utils.CacheKeyUtils;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.EmptySource;
+import org.junit.jupiter.params.provider.ValueSource;
import org.mockito.junit.jupiter.MockitoExtension;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertSame;
+import static org.junit.jupiter.api.Assertions.assertTrue;
/**
* request plugin handler test.
@@ -71,6 +76,44 @@ public class RequestPluginHandlerTest {
this.requestPluginHandler.removeRule(null);
}
+ @ParameterizedTest
+ @EmptySource
+ @ValueSource(strings = {" ", "\t\r\n"})
+ public void testBlankHandleClearsCachedRule(final String handle) {
+ requestPluginHandler.handlerRule(ruleData);
+ String key = CacheKeyUtils.INST.getKey(ruleData);
+
assertNotNull(RequestPluginHandler.CACHED_HANDLE.get().obtainHandle(key));
+
+ ruleData.setHandle(handle);
+ requestPluginHandler.handlerRule(ruleData);
+ assertNull(RequestPluginHandler.CACHED_HANDLE.get().obtainHandle(key));
+
+ requestPluginHandler.handlerRule(ruleData);
+ assertNull(RequestPluginHandler.CACHED_HANDLE.get().obtainHandle(key));
+ }
+
+ @Test
+ public void testNullHandleRetainsCachedRule() {
+ requestPluginHandler.handlerRule(ruleData);
+ String key = CacheKeyUtils.INST.getKey(ruleData);
+ Object cached =
RequestPluginHandler.CACHED_HANDLE.get().obtainHandle(key);
+
+ ruleData.setHandle(null);
+ requestPluginHandler.handlerRule(ruleData);
+
+ assertSame(cached,
RequestPluginHandler.CACHED_HANDLE.get().obtainHandle(key));
+ }
+
+ @Test
+ public void testEmptyObjectReplacesCachedRule() {
+ requestPluginHandler.handlerRule(ruleData);
+ ruleData.setHandle("{}");
+
+ requestPluginHandler.handlerRule(ruleData);
+
+
assertTrue(RequestPluginHandler.CACHED_HANDLE.get().obtainHandle(CacheKeyUtils.INST.getKey(ruleData)).isEmptyConfig());
+ }
+
@Test
public void testPluginNamed() {
assertEquals(this.requestPluginHandler.pluginNamed(), "request");
diff --git
a/shenyu-plugin/shenyu-plugin-rewrite/src/main/java/org/apache/shenyu/plugin/rewrite/handler/RewritePluginDataHandler.java
b/shenyu-plugin/shenyu-plugin-rewrite/src/main/java/org/apache/shenyu/plugin/rewrite/handler/RewritePluginDataHandler.java
index 60ff792dcf..d2cfc981cd 100644
---
a/shenyu-plugin/shenyu-plugin-rewrite/src/main/java/org/apache/shenyu/plugin/rewrite/handler/RewritePluginDataHandler.java
+++
b/shenyu-plugin/shenyu-plugin-rewrite/src/main/java/org/apache/shenyu/plugin/rewrite/handler/RewritePluginDataHandler.java
@@ -17,6 +17,7 @@
package org.apache.shenyu.plugin.rewrite.handler;
+import org.apache.commons.lang3.StringUtils;
import org.apache.shenyu.common.dto.RuleData;
import org.apache.shenyu.common.dto.convert.rule.RewriteHandle;
import org.apache.shenyu.common.enums.PluginEnum;
@@ -39,6 +40,10 @@ public class RewritePluginDataHandler implements
PluginDataHandler {
@Override
public void handlerRule(final RuleData ruleData) {
Optional.ofNullable(ruleData.getHandle()).ifPresent(s -> {
+ if (StringUtils.isBlank(s)) {
+ removeRule(ruleData);
+ return;
+ }
RewriteHandle rewriteHandle = GsonUtils.getInstance().fromJson(s,
RewriteHandle.class);
CACHED_HANDLE.get().cachedHandle(CacheKeyUtils.INST.getKey(ruleData),
rewriteHandle);
});
diff --git
a/shenyu-plugin/shenyu-plugin-rewrite/src/test/java/org/apache/shenyu/plugin/rewrite/handler/RewritePluginDataHandlerTest.java
b/shenyu-plugin/shenyu-plugin-rewrite/src/test/java/org/apache/shenyu/plugin/rewrite/handler/RewritePluginDataHandlerTest.java
index 0b3a9b6860..c8d1041e09 100644
---
a/shenyu-plugin/shenyu-plugin-rewrite/src/test/java/org/apache/shenyu/plugin/rewrite/handler/RewritePluginDataHandlerTest.java
+++
b/shenyu-plugin/shenyu-plugin-rewrite/src/test/java/org/apache/shenyu/plugin/rewrite/handler/RewritePluginDataHandlerTest.java
@@ -22,6 +22,9 @@ import
org.apache.shenyu.common.dto.convert.rule.RewriteHandle;
import org.apache.shenyu.plugin.base.cache.CommonHandleCache;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.EmptySource;
+import org.junit.jupiter.params.provider.ValueSource;
import java.util.function.Supplier;
@@ -61,4 +64,52 @@ public final class RewritePluginDataHandlerTest {
public void testPluginNamed() {
Assertions.assertEquals(rewritePluginDataHandler.pluginNamed(),
"rewrite");
}
+
+ @ParameterizedTest
+ @EmptySource
+ @ValueSource(strings = {" ", "\t\r\n"})
+ public void testBlankHandleClearsCachedRule(final String handle) {
+ ruleData.setSelectorId("clear-selector");
+ ruleData.setId("clear-rule");
+ ruleData.setHandle("{\"regex\":\"/old\",\"replace\":\"/new\"}");
+ rewritePluginDataHandler.handlerRule(ruleData);
+
Assertions.assertNotNull(RewritePluginDataHandler.CACHED_HANDLE.get().obtainHandle("clear-selector_clear-rule"));
+
+ ruleData.setHandle(handle);
+ rewritePluginDataHandler.handlerRule(ruleData);
+
Assertions.assertNull(RewritePluginDataHandler.CACHED_HANDLE.get().obtainHandle("clear-selector_clear-rule"));
+
+ rewritePluginDataHandler.handlerRule(ruleData);
+
Assertions.assertNull(RewritePluginDataHandler.CACHED_HANDLE.get().obtainHandle("clear-selector_clear-rule"));
+ }
+
+ @Test
+ public void testNullHandleRetainsCachedRule() {
+ ruleData.setSelectorId("null-selector");
+ ruleData.setId("null-rule");
+ ruleData.setHandle("{\"regex\":\"/old\",\"replace\":\"/new\"}");
+ rewritePluginDataHandler.handlerRule(ruleData);
+ RewriteHandle cached =
RewritePluginDataHandler.CACHED_HANDLE.get().obtainHandle("null-selector_null-rule");
+
+ ruleData.setHandle(null);
+ rewritePluginDataHandler.handlerRule(ruleData);
+
+ Assertions.assertSame(cached,
RewritePluginDataHandler.CACHED_HANDLE.get().obtainHandle("null-selector_null-rule"));
+ }
+
+ @Test
+ public void testEmptyObjectReplacesCachedRule() {
+ ruleData.setSelectorId("empty-selector");
+ ruleData.setId("empty-rule");
+ ruleData.setHandle("{\"regex\":\"/old\",\"replace\":\"/new\"}");
+ rewritePluginDataHandler.handlerRule(ruleData);
+ ruleData.setHandle("{}");
+
+ rewritePluginDataHandler.handlerRule(ruleData);
+
+ RewriteHandle cached =
RewritePluginDataHandler.CACHED_HANDLE.get().obtainHandle("empty-selector_empty-rule");
+ Assertions.assertNotNull(cached);
+ Assertions.assertNull(cached.getRegex());
+ Assertions.assertNull(cached.getReplace());
+ }
}