From 18e73eaa3b75ab83cdf37290528c4581e920f402 Mon Sep 17 00:00:00 2001 From: Looly Date: Sun, 28 May 2023 12:21:03 +0800 Subject: [PATCH] =?UTF-8?q?UrlQuery=E5=A2=9E=E5=8A=A0setStrict=E6=96=B9?= =?UTF-8?q?=E6=B3=95=EF=BC=8C=E5=8C=BA=E5=88=86=E6=98=AF=E5=90=A6=E4=B8=A5?= =?UTF-8?q?=E6=A0=BC=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 3 ++- .../main/java/cn/hutool/core/net/RFC3986.java | 14 ++++++++++++++ .../java/cn/hutool/core/net/url/UrlQuery.java | 18 ++++++++++++++++++ .../java/cn/hutool/core/net/UrlQueryTest.java | 11 +++++++++++ 4 files changed, 45 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 490fece57..fddf0f48a 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,9 +2,10 @@ # 🚀Changelog ------------------------------------------------------------------------------------------------------------- -# 5.8.20(2023-05-27) +# 5.8.20(2023-05-28) ### 🐣新特性 +* 【core 】 UrlQuery增加setStrict方法,区分是否严格模式(issue#I78PB1@Gitee) ### 🐞Bug修复 diff --git a/hutool-core/src/main/java/cn/hutool/core/net/RFC3986.java b/hutool-core/src/main/java/cn/hutool/core/net/RFC3986.java index d3811b162..5cd56ca13 100755 --- a/hutool-core/src/main/java/cn/hutool/core/net/RFC3986.java +++ b/hutool-core/src/main/java/cn/hutool/core/net/RFC3986.java @@ -69,12 +69,26 @@ public class RFC3986 { */ public static final PercentCodec QUERY_PARAM_VALUE = PercentCodec.of(QUERY).removeSafe('&'); + /** + * query中的value编码器,严格模式,value中不能包含任何分隔符。 + * + * @since 6.0.0 + */ + public static final PercentCodec QUERY_PARAM_VALUE_STRICT = UNRESERVED; + /** * query中的key
* key不能包含"{@code &}" 和 "=" */ public static final PercentCodec QUERY_PARAM_NAME = PercentCodec.of(QUERY_PARAM_VALUE).removeSafe('='); + /** + * query中的key编码器,严格模式,key中不能包含任何分隔符。 + * + * @since 6.0.0 + */ + public static final PercentCodec QUERY_PARAM_NAME_STRICT = UNRESERVED; + /** * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" * diff --git a/hutool-core/src/main/java/cn/hutool/core/net/url/UrlQuery.java b/hutool-core/src/main/java/cn/hutool/core/net/url/UrlQuery.java index 6a59c64f6..b9495f62d 100644 --- a/hutool-core/src/main/java/cn/hutool/core/net/url/UrlQuery.java +++ b/hutool-core/src/main/java/cn/hutool/core/net/url/UrlQuery.java @@ -33,6 +33,10 @@ public class UrlQuery { * 是否为x-www-form-urlencoded模式,此模式下空格会编码为'+' */ private final boolean isFormUrlEncoded; + /** + * 是否严格模式,严格模式下,query的name和value中均不允许有分隔符。 + */ + private boolean isStrict; /** * 构建UrlQuery @@ -136,6 +140,17 @@ public class UrlQuery { this.isFormUrlEncoded = isFormUrlEncoded; } + /** + * 设置是否严格模式 + * @param strict 是否严格模式 + * @return this + * @since 5.8.20 + */ + public UrlQuery setStrict(final boolean strict) { + isStrict = strict; + return this; + } + /** * 增加键值对 * @@ -254,6 +269,9 @@ public class UrlQuery { return build(FormUrlencoded.ALL, FormUrlencoded.ALL, charset, encodePercent); } + if (isStrict) { + return build(RFC3986.QUERY_PARAM_NAME_STRICT, RFC3986.QUERY_PARAM_VALUE_STRICT, charset, encodePercent); + } return build(RFC3986.QUERY_PARAM_NAME, RFC3986.QUERY_PARAM_VALUE, charset, encodePercent); } diff --git a/hutool-core/src/test/java/cn/hutool/core/net/UrlQueryTest.java b/hutool-core/src/test/java/cn/hutool/core/net/UrlQueryTest.java index c50b3c11b..ec5f19a05 100644 --- a/hutool-core/src/test/java/cn/hutool/core/net/UrlQueryTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/net/UrlQueryTest.java @@ -144,4 +144,15 @@ public class UrlQueryTest { final UrlQuery query = UrlQuery.of(queryStr, null); Assert.assertEquals(queryStr, query.toString()); } + + @Test + public void issueI78PB1Test() { + // 严格模式 + final UrlQuery query = new UrlQuery().setStrict(true); + query.add(":/?#[]@!$&'()*+,;= ", ":/?#[]@!$&'()*+,;= "); + + final String string = query.build(CharsetUtil.CHARSET_UTF_8); + Assert.assertEquals("%3A%2F%3F%23%5B%5D%40%21%24%26%27%28%29%2A%2B%2C%3B%3D%20=" + + "%3A%2F%3F%23%5B%5D%40%21%24%26%27%28%29%2A%2B%2C%3B%3D%20", string); + } }