This is an automated email from the ASF dual-hosted git repository. liubao pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git
commit 1e95ef2cab13384b616fffe43206f2294c5d753d Author: liubao <[email protected]> AuthorDate: Wed Dec 30 21:36:24 2020 +0800 [SCB-2116]improve algorithm to match when applying rules --- .../governance/marker/RequestProcessor.java | 9 +- .../governance/marker/operator/ExactOperator.java | 3 +- .../{ExactOperator.java => PrefixOperator.java} | 9 +- .../{ExactOperator.java => SuffixOperator.java} | 9 +- .../servicecomb/governance/OperatorTest.java | 162 +++++++++++++++++++++ 5 files changed, 180 insertions(+), 12 deletions(-) diff --git a/governance/src/main/java/org/apache/servicecomb/governance/marker/RequestProcessor.java b/governance/src/main/java/org/apache/servicecomb/governance/marker/RequestProcessor.java index 26d5acd..a086c4e 100644 --- a/governance/src/main/java/org/apache/servicecomb/governance/marker/RequestProcessor.java +++ b/governance/src/main/java/org/apache/servicecomb/governance/marker/RequestProcessor.java @@ -19,11 +19,10 @@ package org.apache.servicecomb.governance.marker; import java.util.Map; import java.util.Map.Entry; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - import org.apache.servicecomb.governance.marker.operator.MatchOperator; import org.apache.servicecomb.governance.marker.operator.RawOperator; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; @Component public class RequestProcessor { @@ -51,6 +50,10 @@ public class RequestProcessor { } private boolean operatorMatch(String str, RawOperator rawOperator) { + if (rawOperator.isEmpty()) { + return false; + } + for (Entry<String, String> entry : rawOperator.entrySet()) { if (!operatorMap.get(entry.getKey() + OPERATOR_SUFFIX).match(str, entry.getValue())) { return false; diff --git a/governance/src/main/java/org/apache/servicecomb/governance/marker/operator/ExactOperator.java b/governance/src/main/java/org/apache/servicecomb/governance/marker/operator/ExactOperator.java index 44d4c68..0a61427 100644 --- a/governance/src/main/java/org/apache/servicecomb/governance/marker/operator/ExactOperator.java +++ b/governance/src/main/java/org/apache/servicecomb/governance/marker/operator/ExactOperator.java @@ -16,6 +16,7 @@ */ package org.apache.servicecomb.governance.marker.operator; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; @Component @@ -23,6 +24,6 @@ public class ExactOperator implements MatchOperator { @Override public boolean match(String targetStr, String patternStr) { - return targetStr.equals(patternStr); + return StringUtils.equals(targetStr, patternStr); } } diff --git a/governance/src/main/java/org/apache/servicecomb/governance/marker/operator/ExactOperator.java b/governance/src/main/java/org/apache/servicecomb/governance/marker/operator/PrefixOperator.java similarity index 80% copy from governance/src/main/java/org/apache/servicecomb/governance/marker/operator/ExactOperator.java copy to governance/src/main/java/org/apache/servicecomb/governance/marker/operator/PrefixOperator.java index 44d4c68..5fbf611 100644 --- a/governance/src/main/java/org/apache/servicecomb/governance/marker/operator/ExactOperator.java +++ b/governance/src/main/java/org/apache/servicecomb/governance/marker/operator/PrefixOperator.java @@ -14,15 +14,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.apache.servicecomb.governance.marker.operator; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; @Component -public class ExactOperator implements MatchOperator { - +public class PrefixOperator implements MatchOperator { @Override - public boolean match(String targetStr, String patternStr) { - return targetStr.equals(patternStr); + public boolean match(String requestValue, String patternValue) { + return StringUtils.startsWith(requestValue, patternValue); } } diff --git a/governance/src/main/java/org/apache/servicecomb/governance/marker/operator/ExactOperator.java b/governance/src/main/java/org/apache/servicecomb/governance/marker/operator/SuffixOperator.java similarity index 80% copy from governance/src/main/java/org/apache/servicecomb/governance/marker/operator/ExactOperator.java copy to governance/src/main/java/org/apache/servicecomb/governance/marker/operator/SuffixOperator.java index 44d4c68..3e4a224 100644 --- a/governance/src/main/java/org/apache/servicecomb/governance/marker/operator/ExactOperator.java +++ b/governance/src/main/java/org/apache/servicecomb/governance/marker/operator/SuffixOperator.java @@ -14,15 +14,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.apache.servicecomb.governance.marker.operator; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; @Component -public class ExactOperator implements MatchOperator { - +public class SuffixOperator implements MatchOperator { @Override - public boolean match(String targetStr, String patternStr) { - return targetStr.equals(patternStr); + public boolean match(String requestValue, String patternValue) { + return StringUtils.endsWith(requestValue, patternValue); } } diff --git a/governance/src/test/java/org/apache/servicecomb/governance/OperatorTest.java b/governance/src/test/java/org/apache/servicecomb/governance/OperatorTest.java new file mode 100644 index 0000000..40d27c9 --- /dev/null +++ b/governance/src/test/java/org/apache/servicecomb/governance/OperatorTest.java @@ -0,0 +1,162 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 org.apache.servicecomb.governance; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +import org.apache.servicecomb.governance.marker.GovHttpRequest; +import org.apache.servicecomb.governance.marker.Matcher; +import org.apache.servicecomb.governance.marker.RequestProcessor; +import org.apache.servicecomb.governance.marker.operator.RawOperator; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.ConfigFileApplicationContextInitializer; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@ContextConfiguration(locations = "classpath:META-INF/spring/*.xml", initializers = ConfigFileApplicationContextInitializer.class) +public class OperatorTest { + @Autowired + private RequestProcessor requestProcessor; + + @Test + public void test_exact_api_path_match() { + GovHttpRequest request = new GovHttpRequest("service", "1.0"); + request.setUri("/bulkhead"); + Matcher matcher = new Matcher(); + RawOperator apiPath = new RawOperator(); + apiPath.put("exact", "/bulkhead"); + matcher.setApiPath(apiPath); + Assert.assertTrue(requestProcessor.match(request, matcher)); + } + + @Test + public void test_prefix_api_path_match() { + GovHttpRequest request = new GovHttpRequest("service", "1.0"); + request.setUri("/bulkhead/hello"); + Matcher matcher = new Matcher(); + RawOperator apiPath = new RawOperator(); + apiPath.put("prefix", "/bulkhead"); + matcher.setApiPath(apiPath); + Assert.assertTrue(requestProcessor.match(request, matcher)); + } + + @Test + public void test_prefix_api_path_not_match_null() { + GovHttpRequest request = new GovHttpRequest("service", "1.0"); + request.setUri("/bulkhead/hello"); + Matcher matcher = new Matcher(); + RawOperator apiPath = new RawOperator(); + apiPath.put("prefix", null); + matcher.setApiPath(apiPath); + Assert.assertFalse(requestProcessor.match(request, matcher)); + } + + @Test + public void test_suffix_api_path_match() { + GovHttpRequest request = new GovHttpRequest("service", "1.0"); + request.setUri("/api/bulkhead"); + Matcher matcher = new Matcher(); + RawOperator apiPath = new RawOperator(); + apiPath.put("suffix", "/bulkhead"); + matcher.setApiPath(apiPath); + Assert.assertTrue(requestProcessor.match(request, matcher)); + } + + @Test + public void test_suffix_api_path_not_match_null() { + GovHttpRequest request = new GovHttpRequest("service", "1.0"); + request.setUri("/api/bulkhead"); + Matcher matcher = new Matcher(); + RawOperator apiPath = new RawOperator(); + apiPath.put("suffix", null); + matcher.setApiPath(apiPath); + Assert.assertFalse(requestProcessor.match(request, matcher)); + } + + @Test + public void test_exact_api_path_not_match() { + GovHttpRequest request = new GovHttpRequest("service", "1.0"); + request.setUri("/bulkhead/"); + Matcher matcher = new Matcher(); + RawOperator apiPath = new RawOperator(); + apiPath.put("exact", "/bulkhead"); + matcher.setApiPath(apiPath); + Assert.assertFalse(requestProcessor.match(request, matcher)); + + request.setUri("/bulkhead"); + request.setUri(null); + Assert.assertFalse(requestProcessor.match(request, matcher)); + + request.setUri("/bulkhead"); + apiPath.clear(); + matcher.setApiPath(apiPath); + Assert.assertFalse(requestProcessor.match(request, matcher)); + } + + @Test + public void test_exact_api_path_match_header_match() { + GovHttpRequest request = new GovHttpRequest("service", "1.0"); + request.setUri("/bulkhead"); + request.setMethod("GET"); + Map<String, String> reqHeaders = new HashMap<>(); + reqHeaders.put("header1", "value1"); + request.setHeaders(reqHeaders); + Matcher matcher = new Matcher(); + RawOperator apiPath = new RawOperator(); + apiPath.put("exact", "/bulkhead"); + matcher.setApiPath(apiPath); + matcher.setMethod(Arrays.asList("GET")); + Map<String, RawOperator> headers = new HashMap<>(); + RawOperator header1 = new RawOperator(); + header1.put("exact", "value1"); + headers.put("header1", header1); + matcher.setHeaders(headers); + Assert.assertTrue(requestProcessor.match(request, matcher)); + } + + @Test + public void test_exact_api_path_match_header_not_match() { + GovHttpRequest request = new GovHttpRequest("service", "1.0"); + request.setUri("/bulkhead"); + request.setMethod("GET"); + Map<String, String> reqHeaders = new HashMap<>(); + reqHeaders.put("header1", "value2"); + request.setHeaders(reqHeaders); + Matcher matcher = new Matcher(); + RawOperator apiPath = new RawOperator(); + apiPath.put("exact", "/bulkhead"); + matcher.setApiPath(apiPath); + matcher.setMethod(Arrays.asList("GET")); + Map<String, RawOperator> headers = new HashMap<>(); + RawOperator header1 = new RawOperator(); + header1.put("exact", "value1"); + headers.put("header1", header1); + matcher.setHeaders(headers); + Assert.assertFalse(requestProcessor.match(request, matcher)); + + reqHeaders.clear(); + request.setHeaders(reqHeaders); + Assert.assertFalse(requestProcessor.match(request, matcher)); + } +}
