diff --git a/sentinel-extension/sentinel-parameter-flow-control/src/main/java/com/alibaba/csp/sentinel/command/handler/ModifyParamFlowRulesCommandHandler.java b/sentinel-extension/sentinel-parameter-flow-control/src/main/java/com/alibaba/csp/sentinel/command/handler/ModifyParamFlowRulesCommandHandler.java index 2022b16b6c..e035bffe9e 100644 --- a/sentinel-extension/sentinel-parameter-flow-control/src/main/java/com/alibaba/csp/sentinel/command/handler/ModifyParamFlowRulesCommandHandler.java +++ b/sentinel-extension/sentinel-parameter-flow-control/src/main/java/com/alibaba/csp/sentinel/command/handler/ModifyParamFlowRulesCommandHandler.java @@ -15,7 +15,6 @@ */ package com.alibaba.csp.sentinel.command.handler; -import java.net.URLDecoder; import java.util.List; import com.alibaba.csp.sentinel.command.CommandHandler; @@ -44,12 +43,6 @@ public CommandResponse handle(CommandRequest request) { if (StringUtil.isBlank(data)) { return CommandResponse.ofFailure(new IllegalArgumentException("Bad data")); } - try { - data = URLDecoder.decode(data, "utf-8"); - } catch (Exception e) { - RecordLog.info("Decode rule data error", e); - return CommandResponse.ofFailure(e, "decode rule data error"); - } RecordLog.info("[API Server] Receiving rule change (type:parameter flow rule): {}", data); diff --git a/sentinel-extension/sentinel-parameter-flow-control/src/test/java/com/alibaba/csp/sentinel/slots/block/flow/param/ModifyParamFlowRulesCommandHandlerTest.java b/sentinel-extension/sentinel-parameter-flow-control/src/test/java/com/alibaba/csp/sentinel/slots/block/flow/param/ModifyParamFlowRulesCommandHandlerTest.java new file mode 100644 index 0000000000..d1d2f5ada3 --- /dev/null +++ b/sentinel-extension/sentinel-parameter-flow-control/src/test/java/com/alibaba/csp/sentinel/slots/block/flow/param/ModifyParamFlowRulesCommandHandlerTest.java @@ -0,0 +1,55 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.csp.sentinel.slots.block.flow.param; + +import java.util.Collections; +import java.util.List; + +import com.alibaba.csp.sentinel.command.CommandRequest; +import com.alibaba.csp.sentinel.command.CommandResponse; +import com.alibaba.csp.sentinel.command.handler.ModifyParamFlowRulesCommandHandler; +import com.alibaba.fastjson.JSON; +import org.junit.After; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +public class ModifyParamFlowRulesCommandHandlerTest { + + @After + public void tearDown() { + ParamFlowRuleManager.loadRules(Collections.emptyList()); + } + + @Test + public void testHandleDecodedDataPreservesPlusInParamFlowItem() { + ParamFlowRule rule = new ParamFlowRule("test-resource") + .setParamIdx(0) + .setCount(1); + rule.setParamFlowItemList(Collections.singletonList(new ParamFlowItem("a+b", 3, String.class.getName()))); + + CommandRequest request = new CommandRequest(); + request.addParam("data", JSON.toJSONString(Collections.singletonList(rule))); + + CommandResponse response = new ModifyParamFlowRulesCommandHandler().handle(request); + + assertTrue(response.isSuccess()); + List rules = ParamFlowRuleManager.getRulesOfResource("test-resource"); + assertEquals(1, rules.size()); + assertEquals(Integer.valueOf(3), rules.get(0).getParsedHotItems().get("a+b")); + } +}