From aff16c283c3938357975572061dd4c68bd33b8f2 Mon Sep 17 00:00:00 2001 From: Looly Date: Mon, 16 Nov 2020 20:18:53 +0800 Subject: [PATCH] fix test --- CHANGELOG.md | 1 + .../java/cn/hutool/core/net/url/UrlPath.java | 50 +++++++++---------- .../java/cn/hutool/core/util/NumberUtil.java | 2 +- .../java/cn/hutool/core/util/URLUtil.java | 4 +- .../cn/hutool/core/net/UrlBuilderTest.java | 7 +++ .../java/cn/hutool/json/JSONObjectTest.java | 9 ++++ 6 files changed, 44 insertions(+), 29 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 085a3ea41..779271f60 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ ### Bug修复 * 【core 】 修复在Linux下FileUtil.move失败问题(issue#I254Y3@Gitee) +* 【http 】 修复UrlUtil和UrlBuilder中多个/被替换问题(issue#I25MZL@Gitee) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-core/src/main/java/cn/hutool/core/net/url/UrlPath.java b/hutool-core/src/main/java/cn/hutool/core/net/url/UrlPath.java index 31a1b715f..fe0051b6c 100644 --- a/hutool-core/src/main/java/cn/hutool/core/net/url/UrlPath.java +++ b/hutool-core/src/main/java/cn/hutool/core/net/url/UrlPath.java @@ -1,6 +1,7 @@ package cn.hutool.core.net.url; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Assert; import cn.hutool.core.util.CharUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.URLUtil; @@ -8,7 +9,6 @@ import cn.hutool.core.util.URLUtil; import java.nio.charset.Charset; import java.util.LinkedList; import java.util.List; -import java.util.StringTokenizer; /** * URL中Path部分的封装 @@ -17,6 +17,7 @@ import java.util.StringTokenizer; * @since 5.3.1 */ public class UrlPath { + private List segments; private boolean withEngTag; @@ -25,7 +26,7 @@ public class UrlPath { * * @param pathStr 初始化的路径字符串 * @param charset decode用的编码,null表示不做decode - * @return {@link UrlPath} + * @return UrlPath */ public static UrlPath of(String pathStr, Charset charset) { final UrlPath urlPath = new UrlPath(); @@ -73,7 +74,7 @@ public class UrlPath { * @return this */ public UrlPath add(CharSequence segment) { - add(segment, false); + addInternal(fixPath(segment), false); return this; } @@ -84,14 +85,14 @@ public class UrlPath { * @return this */ public UrlPath addBefore(CharSequence segment) { - add(segment, true); + addInternal(fixPath(segment), true); return this; } /** * 解析path * - * @param path 路径,类似于aaa/bb/ccc + * @param path 路径,类似于aaa/bb/ccc或/aaa/bbb/ccc * @param charset decode编码,null表示不解码 * @return this */ @@ -99,16 +100,15 @@ public class UrlPath { UrlPath urlPath = new UrlPath(); if (StrUtil.isNotEmpty(path)) { - path = path.trim(); - // 原URL中以/结尾,则这个规则需保留,issue#I1G44J@Gitee if(StrUtil.endWith(path, CharUtil.SLASH)){ this.withEngTag = true; } - final StringTokenizer tokenizer = new StringTokenizer(path, "/"); - while (tokenizer.hasMoreTokens()) { - add(URLUtil.decode(tokenizer.nextToken(), charset)); + path = fixPath(path); + final List split = StrUtil.split(path, '/'); + for (String seg : split) { + addInternal(URLUtil.decode(seg, charset), false); } } @@ -147,16 +147,12 @@ public class UrlPath { * @param segment 节点 * @param before 是否在前面添加 */ - private void add(CharSequence segment, boolean before) { - final String seg = fixSegment(segment); - if (null == seg) { - return; - } - - + private void addInternal(CharSequence segment, boolean before) { if (this.segments == null) { this.segments = new LinkedList<>(); } + + final String seg = StrUtil.str(segment); if (before) { this.segments.add(0, seg); } else { @@ -165,20 +161,20 @@ public class UrlPath { } /** - * 修正节点,包括去掉前后的/,去掉空白符 + * 修正路径,包括去掉前后的/,去掉空白符 * - * @param segment 节点 - * @return 修正后的节点 + * @param path 节点或路径path + * @return 修正后的路径 */ - private static String fixSegment(CharSequence segment) { - if (StrUtil.isEmpty(segment) || "/".contentEquals(segment)) { - return null; + private static String fixPath(CharSequence path) { + Assert.notNull(path, "Path segment must be not null!"); + if ("/".contentEquals(path)) { + return StrUtil.EMPTY; } - String segmentStr = StrUtil.str(segment); - segmentStr = StrUtil.trim(segmentStr); - segmentStr = StrUtil.removePrefix(segmentStr, "/"); - segmentStr = StrUtil.removeSuffix(segmentStr, "/"); + String segmentStr = StrUtil.trim(path); + segmentStr = StrUtil.removePrefix(segmentStr, StrUtil.SLASH); + segmentStr = StrUtil.removeSuffix(segmentStr, StrUtil.SLASH); segmentStr = StrUtil.trim(segmentStr); return segmentStr; } diff --git a/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java index 5c7781f4b..aa5d5cf34 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java @@ -1972,7 +1972,7 @@ public class NumberUtil { * @param number A Number * @return A String. */ - public static String toStr(Number number) { + public static String toStr(Number number) { Assert.notNull(number, "Number is null !"); // BigDecimal单独处理,使用非科学计数法 diff --git a/hutool-core/src/main/java/cn/hutool/core/util/URLUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/URLUtil.java index c1bbdea85..8a52a090b 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/URLUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/URLUtil.java @@ -707,7 +707,9 @@ public class URLUtil { //noinspection ConstantConditions body = body.replaceAll("^[\\\\/]+", StrUtil.EMPTY); // 替换多个\或/为单个/ - body = body.replace("\\", "/").replaceAll("//+", "/"); + body = body.replace("\\", "/"); + //issue#I25MZL,双斜杠在URL中是允许存在的,不做替换 + //.replaceAll("//+", "/"); } final int pathSepIndex = StrUtil.indexOf(body, '/'); diff --git a/hutool-core/src/test/java/cn/hutool/core/net/UrlBuilderTest.java b/hutool-core/src/test/java/cn/hutool/core/net/UrlBuilderTest.java index fe1b95f47..45923b995 100644 --- a/hutool-core/src/test/java/cn/hutool/core/net/UrlBuilderTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/net/UrlBuilderTest.java @@ -210,4 +210,11 @@ public class UrlBuilderTest { final UrlBuilder urlBuilder = UrlBuilder.ofHttp("http://xtbgyy.digitalgd.com.cn/ebus/../../..", CharsetUtil.CHARSET_UTF_8); Assert.assertEquals("http://xtbgyy.digitalgd.com.cn/ebus/../../..", urlBuilder.toString()); } + + @Test + public void multiSlashTest(){ + //issue#I25MZL,某些URL中有多个斜杠,此为合法路径 + 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()); + } } diff --git a/hutool-json/src/test/java/cn/hutool/json/JSONObjectTest.java b/hutool-json/src/test/java/cn/hutool/json/JSONObjectTest.java index 49f480054..8ad66b43e 100644 --- a/hutool-json/src/test/java/cn/hutool/json/JSONObjectTest.java +++ b/hutool-json/src/test/java/cn/hutool/json/JSONObjectTest.java @@ -526,4 +526,13 @@ public class JSONObjectTest { // 集合类不支持转为JSONObject new JSONObject(new JSONArray(), JSONConfig.create()); } + + @Test + public void floatTest(){ + Map map = new HashMap<>(); + map.put("c", 2.0F); + + final String s = JSONUtil.toJsonStr(map); + Console.log(s); + } }