From b62a9135e3f9f2558574f17275fb095f49ffd8b6 Mon Sep 17 00:00:00 2001 From: fishtailfu Date: Wed, 22 Oct 2025 15:55:49 +0800 Subject: [PATCH 1/4] fix: fix api path trieNode building --- .../main/java/com/tencent/polaris/api/utils/TrieUtil.java | 6 ++++++ 1 file changed, 6 insertions(+) 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..7f0d49f9e 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 @@ -60,6 +60,12 @@ public static TrieNode buildSimpleApiTrieNode(String[] apiPathInfoList) // 跳过第一个为空的str TrieNode node = root; + // 一些场景下(例如dubbo的接口名是com.tencent.polaris.serviceName),apiPath 不以"/"开头和分割,则直接构造node + if (apiPaths.length == 1) { + node = node.getOrCreateSubNode(apiPaths[0]); + node.setNodeInfo(TrieNode.SIMPLE_VALID_INFO + "method:" + method); + continue; + } for (int i = 1; i < apiPaths.length; i++) { node = node.getOrCreateSubNode(apiPaths[i]); From 9ae10f1bedf74993d625a0225237662d8e9b0b73 Mon Sep 17 00:00:00 2001 From: fishtailfu Date: Mon, 27 Oct 2025 17:51:00 +0800 Subject: [PATCH 2/4] fix: fix api path trieNode building --- .../java/com/tencent/polaris/api/utils/TrieUtil.java | 9 +++++++++ .../java/com/tencent/polaris/api/utils/TrieUtilTest.java | 5 +++++ 2 files changed, 14 insertions(+) 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 7f0d49f9e..0f6a5a123 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 @@ -93,6 +93,15 @@ public static boolean checkSimpleApi(TrieNode root, String apiPathInfo) String[] apiPaths = path.split("/"); TrieNode node = root; + // 一些场景下(例如dubbo的接口名是com.tencent.polaris.serviceName),apiPath 不以"/"开头和分割,则直接构造node + if (apiPaths.length == 1) { + node = node.getOrCreateSubNode(apiPaths[0]); + if (node == null) { + return false; + } else { + return checkApiNodeInfo(node, method); + } + } 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..dd8c8f354 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,10 @@ 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(); + Function> func = path -> TrieUtil.buildSimpleApiTrieNode((String) path); + TrieNode rootWithoutSlash = TrieUtil.buildSimpleApiTrieNode("com.tencent.polaris.DemoService"); + assertThat(TrieUtil.checkSimpleApi(rootWithoutSlash, "com.tencent.polaris.DemoService")).isTrue(); + assertThat(TrieUtil.checkSimpleApi(rootWithoutSlash, "com.tencent.polaris.DemoService2")).isFalse(); } @Test From d6c7a0d1fa52225c862fe05b3ecee215201afd3a Mon Sep 17 00:00:00 2001 From: fishtailfu Date: Tue, 28 Oct 2025 10:55:01 +0800 Subject: [PATCH 3/4] fix: fix api path trieNode building --- .../tencent/polaris/api/utils/TrieUtil.java | 24 ++++++++++--------- .../polaris/api/utils/TrieUtilTest.java | 18 ++++++++++---- 2 files changed, 27 insertions(+), 15 deletions(-) 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 0f6a5a123..c07dd5610 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,19 +56,18 @@ public static TrieNode buildSimpleApiTrieNode(String[] apiPathInfoList) // 因为前端的改动(最初的 tagValue 只有 path,某次前端组件改动后变成了 path-method,非客户提的),有兼容性问题, // 临时简化处理,不处理 method,前面逻辑保留是为了取出正确的 path method = null; - String[] apiPaths = path.split("/"); - - // 跳过第一个为空的str TrieNode node = root; - // 一些场景下(例如dubbo的接口名是com.tencent.polaris.serviceName),apiPath 不以"/"开头和分割,则直接构造node - if (apiPaths.length == 1) { - node = node.getOrCreateSubNode(apiPaths[0]); + // 一些场景下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 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); @@ -90,18 +89,21 @@ public static boolean checkSimpleApi(TrieNode root, String apiPathInfo) } else { method = null; } - String[] apiPaths = path.split("/"); + TrieNode node = root; - // 一些场景下(例如dubbo的接口名是com.tencent.polaris.serviceName),apiPath 不以"/"开头和分割,则直接构造node - if (apiPaths.length == 1) { - node = node.getOrCreateSubNode(apiPaths[0]); + // 一些场景下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 dd8c8f354..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 @@ -42,10 +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(); - Function> func = path -> TrieUtil.buildSimpleApiTrieNode((String) path); - TrieNode rootWithoutSlash = TrieUtil.buildSimpleApiTrieNode("com.tencent.polaris.DemoService"); - assertThat(TrieUtil.checkSimpleApi(rootWithoutSlash, "com.tencent.polaris.DemoService")).isTrue(); - assertThat(TrieUtil.checkSimpleApi(rootWithoutSlash, "com.tencent.polaris.DemoService2")).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 From d628c92b5ecf61a218cf2c6a2ca1df31448316f6 Mon Sep 17 00:00:00 2001 From: fishtailfu Date: Tue, 28 Oct 2025 10:57:24 +0800 Subject: [PATCH 4/4] fix: fix api path trieNode building --- .../src/main/java/com/tencent/polaris/api/utils/TrieUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 c07dd5610..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 @@ -57,7 +57,7 @@ public static TrieNode buildSimpleApiTrieNode(String[] apiPathInfoList) // 临时简化处理,不处理 method,前面逻辑保留是为了取出正确的 path method = null; TrieNode node = root; - // 一些场景下apiPath 不以"/"开头和分割( + // 一些场景下apiPath 不以"/"开头和分割 // 此时方法标识符的格式规定为 '{类路径}#{方法名}' 例如com.tencent.polaris.ServiceName#sayHello if (path.contains("#")) { node = node.getOrCreateSubNode(path);