Fix URLParam decode default value (#11983)

* Fix URLParam decode default value

* Add test cases
This commit is contained in:
Albumen Kevin 2023-04-02 20:11:50 +08:00 committed by GitHub
parent 77cbbcee3f
commit f32da50a3b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 79 additions and 3 deletions

View File

@ -994,7 +994,13 @@ public class URLParam {
Map<String, Map<String, String>> methodParameters = new HashMap<>(capacity);
for (Map.Entry<String, String> 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 {

View File

@ -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"));
}
}
}

View File

@ -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"));
}
}

View File

@ -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");

View File

@ -81,6 +81,33 @@ class URLParamTest {
Assertions.assertEquals(urlParam3, URLParam.parse(urlParam3.getRawParam()));
}
@Test
void testDefault() {
Map<String, String> 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"));
}
}
}