diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/url/component/URLParam.java b/dubbo-common/src/main/java/org/apache/dubbo/common/url/component/URLParam.java index 243e1d42ca..cf6ba67510 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/url/component/URLParam.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/url/component/URLParam.java @@ -994,7 +994,13 @@ public class URLParam { Map> methodParameters = new HashMap<>(capacity); for (Map.Entry entry : params.entrySet()) { - addParameter(keyBit, valueMap, extraParam, methodParameters, entry.getKey(), entry.getValue(), false); + String key = entry.getKey(); + String value = entry.getValue(); + addParameter(keyBit, valueMap, extraParam, methodParameters, key, value, false); + // compatible with lower versions registering "default." keys + if (key.startsWith(DEFAULT_KEY_PREFIX)) { + addParameter(keyBit, valueMap, extraParam, methodParameters, key.substring(DEFAULT_KEY_PREFIX.length()), value, true); + } } return new URLParam(keyBit, valueMap, extraParam, methodParameters, rawParam); } else { diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/URLBuilderTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/URLBuilderTest.java index 9967a7bd02..219f9d9759 100644 --- a/dubbo-common/src/test/java/org/apache/dubbo/common/URLBuilderTest.java +++ b/dubbo-common/src/test/java/org/apache/dubbo/common/URLBuilderTest.java @@ -16,6 +16,7 @@ */ package org.apache.dubbo.common; +import org.apache.dubbo.common.url.component.ServiceConfigURL; import org.apache.dubbo.common.utils.NetUtils; import org.junit.jupiter.api.Test; @@ -47,6 +48,24 @@ class URLBuilderTest { assertThat(url2.getVersion(), equalTo("1")); } + @Test + void testDefault() { + ServiceConfigURL url1 = URLBuilder.from(URL.valueOf("")) + .addParameter("timeout", "1234") + .addParameter("default.timeout", "5678") + .build(); + + assertThat(url1.getParameter("timeout"), equalTo("1234")); + assertThat(url1.getParameter("default.timeout"), equalTo("5678")); + + ServiceConfigURL url2 = URLBuilder.from(URL.valueOf("")) + .addParameter("default.timeout", "5678") + .build(); + + assertThat(url2.getParameter("timeout"), equalTo("5678")); + assertThat(url2.getParameter("default.timeout"), equalTo("5678")); + } + @Test void shouldSet() { URL url1 = URL.valueOf("dubbo://admin:hello1234@10.20.130.230:20880/context/path?version=1.0.0&application=morgan"); @@ -145,4 +164,4 @@ class URLBuilderTest { assertThat(url2.getParameter("version"), equalTo("1.0.0")); assertThat(url2.getParameter("absentKey"), equalTo("absentValue")); } -} \ No newline at end of file +} diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/URLStrParserTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/URLStrParserTest.java index 6fccf104b0..67d13caa2b 100644 --- a/dubbo-common/src/test/java/org/apache/dubbo/common/URLStrParserTest.java +++ b/dubbo-common/src/test/java/org/apache/dubbo/common/URLStrParserTest.java @@ -45,6 +45,8 @@ class URLStrParserTest { testCases.add("dubbo://fe80:0:0:0:894:aeec:f37d:23e1%en0/path?abc=abc"); testCases.add("dubbo://[fe80:0:0:0:894:aeec:f37d:23e1]:20880/path?abc=abc"); testCases.add("nacos://192.168.1.1:8848?username=&password="); + testCases.add("dubbo://127.0.0.1?timeout=1234&default.timeout=5678"); + testCases.add("dubbo://127.0.0.1?default.timeout=5678"); errorDecodedCases.add("dubbo:192.168.1.1"); errorDecodedCases.add("://192.168.1.1"); @@ -81,4 +83,15 @@ class URLStrParserTest { }); } + @Test + void testDefault() { + URL url1 = URLStrParser.parseEncodedStr(URL.encode("dubbo://127.0.0.1?timeout=1234&default.timeout=5678")); + assertThat(url1.getParameter("timeout"), equalTo("1234")); + assertThat(url1.getParameter("default.timeout"), equalTo("5678")); + + URL url2 = URLStrParser.parseEncodedStr(URL.encode("dubbo://127.0.0.1?default.timeout=5678")); + assertThat(url2.getParameter("timeout"), equalTo("5678")); + assertThat(url2.getParameter("default.timeout"), equalTo("5678")); + } + } diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/URLTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/URLTest.java index 334ec39684..78c96e2891 100644 --- a/dubbo-common/src/test/java/org/apache/dubbo/common/URLTest.java +++ b/dubbo-common/src/test/java/org/apache/dubbo/common/URLTest.java @@ -59,6 +59,17 @@ class URLTest { assertEquals("org.apache.dubbo.config.RegistryConfig#0", url.getParameter("id")); } + @Test + void testDefault() { + URL url1 = URL.valueOf("dubbo://127.0.0.1:12345?timeout=1234&default.timeout=5678"); + assertEquals(1234, url1.getParameter("timeout", 0)); + assertEquals(5678, url1.getParameter("default.timeout", 0)); + + URL url2 = URL.valueOf("dubbo://127.0.0.1:12345?default.timeout=5678"); + assertEquals(5678, url2.getParameter("timeout", 0)); + assertEquals(5678, url2.getParameter("default.timeout", 0)); + } + @Test void test_valueOf_noProtocolAndHost() throws Exception { URL url = URL.valueOf("/context/path?version=1.0.0&application=morgan"); diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/url/URLParamTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/url/URLParamTest.java index d230dd7bcf..e881841152 100644 --- a/dubbo-common/src/test/java/org/apache/dubbo/common/url/URLParamTest.java +++ b/dubbo-common/src/test/java/org/apache/dubbo/common/url/URLParamTest.java @@ -81,6 +81,33 @@ class URLParamTest { Assertions.assertEquals(urlParam3, URLParam.parse(urlParam3.getRawParam())); } + @Test + void testDefault() { + Map map = new HashMap<>(); + map.put("aaa", "aaa"); + map.put("bbb", "bbb"); + map.put("version", "2.0"); + map.put("timeout", "1234"); + map.put("default.timeout", "5678"); + + URLParam urlParam1 = URLParam.parse(map); + Assertions.assertEquals("1234", urlParam1.getParameter("timeout")); + Assertions.assertEquals("5678", urlParam1.getParameter("default.timeout")); + + map.remove("timeout"); + URLParam urlParam2 = URLParam.parse(map); + Assertions.assertEquals("5678", urlParam2.getParameter("timeout")); + Assertions.assertEquals("5678", urlParam2.getParameter("default.timeout")); + + URLParam urlParam3 = URLParam.parse("timeout=1234&default.timeout=5678"); + Assertions.assertEquals("1234", urlParam3.getParameter("timeout")); + Assertions.assertEquals("5678", urlParam3.getParameter("default.timeout")); + + URLParam urlParam4 = URLParam.parse("default.timeout=5678"); + Assertions.assertEquals("5678", urlParam4.getParameter("timeout")); + Assertions.assertEquals("5678", urlParam4.getParameter("default.timeout")); + } + @Test void testGetParameter() { URLParam urlParam1 = URLParam.parse("aaa=aaa&bbb&version=1.0&default.ccc=123"); @@ -270,4 +297,4 @@ class URLParamTest { Assertions.assertEquals("aaa",urlParam2.getAnyMethodParameter("method1")); Assertions.assertNull(urlParam2.getAnyMethodParameter("method2")); } -} \ No newline at end of file +}