mirror of
https://gitee.com/chinabugotech/hutool.git
synced 2025-07-21 15:09:48 +08:00
fix UrlBuilder bug
This commit is contained in:
@@ -135,7 +135,7 @@ public final class UrlBuilder implements Serializable {
|
||||
* @return UrlBuilder
|
||||
*/
|
||||
public static UrlBuilder of(String scheme, String host, int port, String path, String query, String fragment, Charset charset) {
|
||||
return of(scheme, host, port, UrlPath.of(path, charset), UrlQuery.of(query, charset), fragment, charset);
|
||||
return of(scheme, host, port, UrlPath.of(path, charset), UrlQuery.of(query, charset, false), fragment, charset);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -504,4 +504,4 @@ public final class UrlBuilder implements Serializable {
|
||||
return build();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@@ -29,7 +29,7 @@ public class UrlQuery {
|
||||
* 构建UrlQuery
|
||||
*
|
||||
* @param queryMap 初始化的查询键值对
|
||||
* @return {@link UrlQuery}
|
||||
* @return UrlQuery
|
||||
*/
|
||||
public static UrlQuery of(Map<? extends CharSequence, ?> queryMap) {
|
||||
return new UrlQuery(queryMap);
|
||||
@@ -40,11 +40,24 @@ public class UrlQuery {
|
||||
*
|
||||
* @param queryStr 初始化的查询字符串
|
||||
* @param charset decode用的编码,null表示不做decode
|
||||
* @return {@link UrlQuery}
|
||||
* @return UrlQuery
|
||||
*/
|
||||
public static UrlQuery of(String queryStr, Charset charset) {
|
||||
return of(queryStr, charset, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建UrlQuery
|
||||
*
|
||||
* @param queryStr 初始化的查询字符串
|
||||
* @param charset decode用的编码,null表示不做decode
|
||||
* @param autoRemovePath 是否自动去除path部分,{@code true}则自动去除第一个?前的内容
|
||||
* @return UrlQuery
|
||||
* @since 5.5.8
|
||||
*/
|
||||
public static UrlQuery of(String queryStr, Charset charset, boolean autoRemovePath) {
|
||||
final UrlQuery urlQuery = new UrlQuery();
|
||||
urlQuery.parse(queryStr, charset);
|
||||
urlQuery.parse(queryStr, charset, autoRemovePath);
|
||||
return urlQuery;
|
||||
}
|
||||
|
||||
@@ -102,16 +115,31 @@ public class UrlQuery {
|
||||
* @return this
|
||||
*/
|
||||
public UrlQuery parse(String queryStr, Charset charset) {
|
||||
return parse(queryStr, charset, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* 解析URL中的查询字符串
|
||||
*
|
||||
* @param queryStr 查询字符串,类似于key1=v1&key2=&key3=v3
|
||||
* @param charset decode编码,null表示不做decode
|
||||
* @param autoRemovePath 是否自动去除path部分,{@code true}则自动去除第一个?前的内容
|
||||
* @return this
|
||||
* @since 5.5.8
|
||||
*/
|
||||
public UrlQuery parse(String queryStr, Charset charset, boolean autoRemovePath) {
|
||||
if (StrUtil.isBlank(queryStr)) {
|
||||
return this;
|
||||
}
|
||||
|
||||
// 去掉Path部分
|
||||
int pathEndPos = queryStr.indexOf('?');
|
||||
if (pathEndPos > -1) {
|
||||
queryStr = StrUtil.subSuf(queryStr, pathEndPos + 1);
|
||||
if (StrUtil.isBlank(queryStr)) {
|
||||
return this;
|
||||
if (autoRemovePath) {
|
||||
// 去掉Path部分
|
||||
int pathEndPos = queryStr.indexOf('?');
|
||||
if (pathEndPos > -1) {
|
||||
queryStr = StrUtil.subSuf(queryStr, pathEndPos + 1);
|
||||
if (StrUtil.isBlank(queryStr)) {
|
||||
return this;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -135,9 +163,9 @@ public class UrlQuery {
|
||||
case '&'://键值对之间的分界符
|
||||
addParam(name, queryStr.substring(pos, i), charset);
|
||||
name = null;
|
||||
if (i+4 < len && "amp;".equals(queryStr.substring(i + 1, i + 5))) {
|
||||
if (i + 4 < len && "amp;".equals(queryStr.substring(i + 1, i + 5))) {
|
||||
// issue#850@Github,"&"转义为"&"
|
||||
i+=4;
|
||||
i += 4;
|
||||
}
|
||||
// 开始位置从分节符后开始
|
||||
pos = i + 1;
|
||||
|
@@ -332,7 +332,7 @@ public class URLUtil {
|
||||
* @throws UtilException UnsupportedEncodingException
|
||||
*/
|
||||
public static String encodeAll(String url, Charset charset) throws UtilException {
|
||||
if (null == charset) {
|
||||
if (null == charset || StrUtil.isEmpty(url)) {
|
||||
return url;
|
||||
}
|
||||
|
||||
@@ -870,4 +870,4 @@ public class URLUtil {
|
||||
|
||||
return builder.toString();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -6,6 +6,10 @@ import cn.hutool.core.util.CharsetUtil;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
public class UrlBuilderTest {
|
||||
|
||||
@Test
|
||||
@@ -217,4 +221,18 @@ public class UrlBuilderTest {
|
||||
final UrlBuilder urlBuilder = UrlBuilder.ofHttp("https://hutool.cn//file/test.jpg", CharsetUtil.CHARSET_UTF_8);
|
||||
Assert.assertEquals("https://hutool.cn//file/test.jpg", urlBuilder.toString());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void toURITest() throws URISyntaxException {
|
||||
String webUrl = "http://exmple.com/patha/pathb?a=123"; // 报错数据
|
||||
final UrlBuilder urlBuilder = UrlBuilder.of(webUrl, StandardCharsets.UTF_8);
|
||||
Assert.assertEquals(new URI(webUrl), urlBuilder.toURI());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testEncodeInQuery() {
|
||||
String webUrl = "http://exmple.com/patha/pathb?a=123&b=4?6&c=789"; // b=4?6 参数中有未编码的?
|
||||
final UrlBuilder urlBuilder = UrlBuilder.of(webUrl, StandardCharsets.UTF_8);
|
||||
Assert.assertEquals("a=123&b=4%3F6&c=789", urlBuilder.getQueryStr());
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user