diff --git a/hutool-core/src/main/java/cn/hutool/core/net/URLDecoder.java b/hutool-core/src/main/java/cn/hutool/core/net/URLDecoder.java index 82f4c0dd2..088c4ad6a 100644 --- a/hutool-core/src/main/java/cn/hutool/core/net/URLDecoder.java +++ b/hutool-core/src/main/java/cn/hutool/core/net/URLDecoder.java @@ -1,5 +1,6 @@ package cn.hutool.core.net; +import cn.hutool.core.lang.Console; import cn.hutool.core.util.CharUtil; import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.StrUtil; @@ -87,6 +88,11 @@ public class URLDecoder implements Serializable { char c; for (int i = 0; i < length; i++) { c = str.charAt(i); + if('+' == c){ + result.append(isPlusToSpace ? CharUtil.SPACE : c); + begin++; + continue; + } if(ESCAPE_CHAR == c || CharUtil.isHexChar(c)){ continue; } diff --git a/hutool-core/src/test/java/cn/hutool/core/net/UrlDecoderTest.java b/hutool-core/src/test/java/cn/hutool/core/net/UrlDecoderTest.java index 42d3fa6f0..93d4bba65 100644 --- a/hutool-core/src/test/java/cn/hutool/core/net/UrlDecoderTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/net/UrlDecoderTest.java @@ -14,6 +14,12 @@ public class UrlDecoderTest { Assert.assertEquals("+", URLDecoder.decodeForPath("+", CharsetUtil.CHARSET_UTF_8)); } + @Test + public void decodePlusTest() { + final String decode = URLDecoder.decode("+", CharsetUtil.CHARSET_UTF_8); + Assert.assertEquals(" ", decode); + } + @Test public void issue3063Test() throws UnsupportedEncodingException { // https://github.com/dromara/hutool/issues/3063 diff --git a/hutool-http/src/test/java/cn/hutool/http/HttpUtilTest.java b/hutool-http/src/test/java/cn/hutool/http/HttpUtilTest.java index e4532385e..8570f5aa7 100755 --- a/hutool-http/src/test/java/cn/hutool/http/HttpUtilTest.java +++ b/hutool-http/src/test/java/cn/hutool/http/HttpUtilTest.java @@ -383,17 +383,19 @@ public class HttpUtilTest { @Test public void httpParameterDecodeTest () { - String test = "this is test测试"; - int port = NetUtil.getUsableLocalPort(); + final String test = "this is test测试"; + final int port = NetUtil.getUsableLocalPort(); HttpUtil.createServer(port) .addAction("/formEncoded", (req, resp) -> resp.write(req.getParam("test"))) .addAction("/urlEncoded", (req, resp) -> resp.write(req.getParam("test"))) .start(); - String resp = HttpUtil.createPost(String.format("http://localhost:%s/formEncoded", port)) + + final String resp = HttpUtil.createPost(String.format("http://localhost:%s/formEncoded", port)) .form("test", test).execute().body(); Assert.assertEquals("Form请求参数解码", test, resp); - String urlGet = UrlBuilder.of(String.format("http://localhost:%s/urlEncoded", port)).addQuery("test", test).build(); - String resp2 = HttpUtil.createGet(urlGet).execute().body(); + + final String urlGet = UrlBuilder.of(String.format("http://localhost:%s/urlEncoded", port)).addQuery("test", test).build(); + final String resp2 = HttpUtil.createGet(urlGet).execute().body(); Assert.assertEquals("QueryString请求参数编码", test, resp2); } }