Allow negative paramIndex as reversed-order in ParamFlowRule (#549)

* Allow negative paramIndex in ParamFlowRule

Signed-off-by: Carpenter Lee <hooleeucas@163.com>
This commit is contained in:
Carpenter Lee 2019-03-06 19:06:58 +08:00 committed by Eric Zhao
parent d05a603873
commit 80797ae85e
3 changed files with 16 additions and 4 deletions

View File

@ -52,7 +52,7 @@ final class ParamFlowChecker {
}
// Get parameter value. If value is null, then pass.
Object value = args[paramIdx];
Object value = valueAt(args, paramIdx);
if (value == null) {
return true;
}
@ -64,6 +64,18 @@ final class ParamFlowChecker {
return passLocalCheck(resourceWrapper, rule, count, value);
}
private static Object valueAt(Object[] args, int paramIdx) {
Object value = null;
if (paramIdx < 0) {
if (-paramIdx <= args.length) {
return args[args.length + paramIdx];
}
} else {
value = args[paramIdx];
}
return value;
}
private static boolean passLocalCheck(ResourceWrapper resourceWrapper, ParamFlowRule rule, int count,
Object value) {
try {
@ -112,7 +124,7 @@ final class ParamFlowChecker {
int itemThreshold = rule.getParsedHotItems().get(value);
return ++threadCount <= itemThreshold;
}
long threshold = (long) rule.getCount();
long threshold = (long)rule.getCount();
return ++threadCount <= threshold;
}

View File

@ -31,7 +31,7 @@ public final class ParamFlowRuleUtil {
public static boolean isValidRule(ParamFlowRule rule) {
return rule != null && !StringUtil.isBlank(rule.getResource()) && rule.getCount() >= 0
&& rule.getGrade() >= 0 && rule.getParamIdx() != null && rule.getParamIdx() >= 0 && checkCluster(rule);
&& rule.getGrade() >= 0 && rule.getParamIdx() != null && checkCluster(rule);
}
private static boolean checkCluster(/*@PreChecked*/ ParamFlowRule rule) {

View File

@ -35,7 +35,7 @@ public class ParamFlowRuleUtilTest {
.setCount(1)
.setParamIdx(-1);
assertFalse(ParamFlowRuleUtil.isValidRule(rule4));
assertFalse(ParamFlowRuleUtil.isValidRule(rule5));
assertTrue(ParamFlowRuleUtil.isValidRule(rule5));
ParamFlowRule goodRule = new ParamFlowRule("abc")
.setCount(10)