diff --git a/polaris-common/polaris-model/src/main/java/com/tencent/polaris/api/utils/TrieUtil.java b/polaris-common/polaris-model/src/main/java/com/tencent/polaris/api/utils/TrieUtil.java index a99e54e2e..38067f957 100644 --- a/polaris-common/polaris-model/src/main/java/com/tencent/polaris/api/utils/TrieUtil.java +++ b/polaris-common/polaris-model/src/main/java/com/tencent/polaris/api/utils/TrieUtil.java @@ -56,13 +56,18 @@ public static TrieNode buildSimpleApiTrieNode(String[] apiPathInfoList) // 因为前端的改动(最初的 tagValue 只有 path,某次前端组件改动后变成了 path-method,非客户提的),有兼容性问题, // 临时简化处理,不处理 method,前面逻辑保留是为了取出正确的 path method = null; + TrieNode node = root; + // 一些场景下apiPath 不以"/"开头和分割 + // 此时方法标识符的格式规定为 '{类路径}#{方法名}' 例如com.tencent.polaris.ServiceName#sayHello + if (path.contains("#")) { + node = node.getOrCreateSubNode(path); + node.setNodeInfo(TrieNode.SIMPLE_VALID_INFO + "method:" + method); + continue; + } String[] apiPaths = path.split("/"); - // 跳过第一个为空的str - TrieNode node = root; for (int i = 1; i < apiPaths.length; i++) { node = node.getOrCreateSubNode(apiPaths[i]); - // 叶子节点,需要 info if (i == apiPaths.length - 1) { node.setNodeInfo(TrieNode.SIMPLE_VALID_INFO + "method:" + method); @@ -84,9 +89,21 @@ public static boolean checkSimpleApi(TrieNode root, String apiPathInfo) } else { method = null; } - String[] apiPaths = path.split("/"); + TrieNode node = root; + // 一些场景下apiPath 不以"/"开头和分割( + // 此时方法标识符的格式规定为 '{类路径}#{方法名}' 例如com.tencent.polaris.ServiceName#sayHello + if(apiPathInfo.contains("#")){ + node = node.getOrCreateSubNode(apiPathInfo); + if (node == null) { + return false; + } else { + return checkApiNodeInfo(node, method); + } + } + + String[] apiPaths = path.split("/"); for (int i = 1; i < apiPaths.length; i++) { if (node == null) { return false; diff --git a/polaris-common/polaris-model/src/test/java/com/tencent/polaris/api/utils/TrieUtilTest.java b/polaris-common/polaris-model/src/test/java/com/tencent/polaris/api/utils/TrieUtilTest.java index 3911564a5..70a1b0b39 100644 --- a/polaris-common/polaris-model/src/test/java/com/tencent/polaris/api/utils/TrieUtilTest.java +++ b/polaris-common/polaris-model/src/test/java/com/tencent/polaris/api/utils/TrieUtilTest.java @@ -18,6 +18,7 @@ package com.tencent.polaris.api.utils; import com.tencent.polaris.api.pojo.TrieNode; +import java.util.function.Function; import org.junit.Test; import static org.assertj.core.api.Assertions.assertThat; @@ -41,6 +42,20 @@ public void testCheckSimple() { assertThat(TrieUtil.checkSimpleApi(rootWithoutMethod, "/echo/test-POST")).isTrue(); assertThat(TrieUtil.checkSimpleApi(rootWithoutMethod, "/echoo/test-GET")).isFalse(); assertThat(TrieUtil.checkSimpleApi(rootWithoutMethod, "/echo/-GET")).isFalse(); + assertThat(TrieUtil.checkSimpleApi(rootWithoutMethod, "/echo/##/aa")).isFalse(); + + TrieNode rootWithoutSlash = TrieUtil.buildSimpleApiTrieNode("com.tencent.polaris.DemoService#aaa"); + assertThat(TrieUtil.checkSimpleApi(rootWithoutSlash, "com.tencent.polaris.DemoService#aaa")).isTrue(); + assertThat(TrieUtil.checkSimpleApi(rootWithoutSlash, "com.tencent.polaris.DemoService#aab")).isFalse(); + assertThat(TrieUtil.checkSimpleApi(rootWithoutSlash, "com.tencent.polaris.DemoService1#aaa")).isFalse(); + assertThat(TrieUtil.checkSimpleApi(rootWithoutSlash, "/com.tencent.polaris.DemoService#aaa")).isFalse(); + assertThat(TrieUtil.checkSimpleApi(rootWithoutSlash, "#com.tencent.polaris.DemoService.aaa")).isFalse(); + assertThat(TrieUtil.checkSimpleApi(rootWithoutSlash, "#")).isFalse(); + assertThat(TrieUtil.checkSimpleApi(rootWithoutSlash, "/#")).isFalse(); + TrieNode rootWithoutSlash2 = TrieUtil.buildSimpleApiTrieNode("path#method"); + assertThat(TrieUtil.checkSimpleApi(rootWithoutSlash2, "path#method")).isTrue(); + assertThat(TrieUtil.checkSimpleApi(rootWithoutSlash2, "/path#method")).isFalse(); + assertThat(TrieUtil.checkSimpleApi(rootWithoutSlash2, "path##method")).isFalse(); } @Test