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

Reply via email to