From 311829660ff9fd47c354955b886ef46e988cd4c0 Mon Sep 17 00:00:00 2001 From: bwcx_jzy Date: Thu, 13 Oct 2022 15:23:33 +0800 Subject: [PATCH 1/5] add UrlBuilder getPortWithDefault --- .../cn/hutool/core/net/url/UrlBuilder.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/hutool-core/src/main/java/cn/hutool/core/net/url/UrlBuilder.java b/hutool-core/src/main/java/cn/hutool/core/net/url/UrlBuilder.java index 2689748a3..dc168afcf 100755 --- a/hutool-core/src/main/java/cn/hutool/core/net/url/UrlBuilder.java +++ b/hutool-core/src/main/java/cn/hutool/core/net/url/UrlBuilder.java @@ -291,6 +291,26 @@ public final class UrlBuilder implements Builder { return port; } + /** + * 获取端口,如果未自定义返回协议默认端口 + * + * @return 端口 + */ + public int getPortWithDefault() { + int port = getPort(); + if (port != -1) { + return port; + } + switch (this.scheme) { + case "http": + return 80; + case "https": + return 443; + default: + return port; + } + } + /** * 设置端口,默认-1 * From 7bbd33b0b02f262072610a501da5ad5c84627c28 Mon Sep 17 00:00:00 2001 From: bwcx_jzy Date: Thu, 13 Oct 2022 15:41:34 +0800 Subject: [PATCH 2/5] fix UrlBuilder getPortWithDefault --- .../cn/hutool/core/net/url/UrlBuilder.java | 12 +--- .../cn/hutool/core/net/UrlBuilderTest.java | 64 ++++++++++--------- 2 files changed, 36 insertions(+), 40 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/net/url/UrlBuilder.java b/hutool-core/src/main/java/cn/hutool/core/net/url/UrlBuilder.java index dc168afcf..92b938de4 100755 --- a/hutool-core/src/main/java/cn/hutool/core/net/url/UrlBuilder.java +++ b/hutool-core/src/main/java/cn/hutool/core/net/url/UrlBuilder.java @@ -298,17 +298,11 @@ public final class UrlBuilder implements Builder { */ public int getPortWithDefault() { int port = getPort(); - if (port != -1) { + if (port > 0) { return port; } - switch (this.scheme) { - case "http": - return 80; - case "https": - return 443; - default: - return port; - } + URL url = this.toURL(); + return url.getDefaultPort(); } /** 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 019f001d3..8261c316e 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 @@ -16,12 +16,14 @@ public class UrlBuilderTest { @Test public void buildTest() { - final String buildUrl = UrlBuilder.of().setHost("www.hutool.cn").build(); + UrlBuilder builder = UrlBuilder.of(); + final String buildUrl = builder.setHost("www.hutool.cn").build(); Assert.assertEquals("http://www.hutool.cn/", buildUrl); + Assert.assertEquals(buildUrl, builder.getPortWithDefault(), 80); } @Test - public void buildWithoutSlashTest(){ + public void buildWithoutSlashTest() { // https://github.com/dromara/hutool/issues/2459 String buildUrl = UrlBuilder.of().setScheme("http").setHost("192.168.1.1").setPort(8080).setWithEndTag(false).build(); Assert.assertEquals("http://192.168.1.1:8080", buildUrl); @@ -204,7 +206,7 @@ public class UrlBuilderTest { } @Test - public void weixinUrlTest(){ + public void weixinUrlTest() { final String urlStr = "https://mp.weixin.qq.com/s?" + "__biz=MzI5NjkyNTIxMg==" + "&mid=100000465" + @@ -214,15 +216,15 @@ public class UrlBuilderTest { final UrlBuilder builder = UrlBuilder.ofHttp(urlStr, CharsetUtil.CHARSET_UTF_8); // 原URL中的&替换为& Assert.assertEquals("https://mp.weixin.qq.com/s?" + - "__biz=MzI5NjkyNTIxMg==" + - "&mid=100000465&idx=1" + - "&sn=1044c0d19723f74f04f4c1da34eefa35" + - "&chksm=6cbda3a25bca2ab4516410db6ce6e125badaac2f8c5548ea6e18eab6dc3c5422cb8cbe1095f7", + "__biz=MzI5NjkyNTIxMg==" + + "&mid=100000465&idx=1" + + "&sn=1044c0d19723f74f04f4c1da34eefa35" + + "&chksm=6cbda3a25bca2ab4516410db6ce6e125badaac2f8c5548ea6e18eab6dc3c5422cb8cbe1095f7", builder.toString()); } @Test - public void endWithSlashTest(){ + public void endWithSlashTest() { // 原URL中以/结尾,则这个规则需保留,issue#I1G44J@Gitee final String today = DateUtil.date().toString("yyyyMMdd"); final String getWorkDayUrl = "https://tool.bitefu.net/jiari/?info=1&d=" + today; @@ -231,19 +233,19 @@ public class UrlBuilderTest { } @Test - public void blankEncodeTest(){ + public void blankEncodeTest() { final UrlBuilder urlBuilder = UrlBuilder.ofHttp("http://a.com/aaa bbb.html", CharsetUtil.CHARSET_UTF_8); Assert.assertEquals("http://a.com/aaa%20bbb.html", urlBuilder.toString()); } @Test - public void dotEncodeTest(){ + public void dotEncodeTest() { 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(){ + 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()); @@ -264,7 +266,7 @@ public class UrlBuilderTest { } @Test - public void encodePathTest(){ + public void encodePathTest() { // Path中的某些符号无需转义,比如= final String urlStr = "http://hq.sinajs.cn/list=sh600519"; final UrlBuilder urlBuilder = UrlBuilder.ofHttp(urlStr, CharsetUtil.CHARSET_UTF_8); @@ -272,7 +274,7 @@ public class UrlBuilderTest { } @Test - public void encodePathTest2(){ + public void encodePathTest2() { // https://gitee.com/dromara/hutool/issues/I4RA42 // Path中`:`在第一个segment需要转义,之后的不需要 final String urlStr = "https://hutool.cn/aa/bb/Pre-K,Kindergarten,First,Second,Third,Fourth,Fifth/Page:3"; @@ -281,7 +283,7 @@ public class UrlBuilderTest { } @Test - public void gimg2Test(){ + public void gimg2Test() { final String url = "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fpic.jj20.com%2Fup%2Fallimg%2F1114%2F0H320120Z3%2F200H3120Z3-6-1200.jpg&refer=http%3A%2F%2Fpic.jj20.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1621996490&t=8c384c2823ea453da15a1b9cd5183eea"; final UrlBuilder urlBuilder = UrlBuilder.of(url); @@ -291,7 +293,7 @@ public class UrlBuilderTest { } @Test - public void fragmentEncodeTest(){ + public void fragmentEncodeTest() { // https://gitee.com/dromara/hutool/issues/I49KAL // 见:https://stackoverflow.com/questions/26088849/url-fragment-allowed-characters final String url = "https://hutool.cn/docs/#/?id=简介"; @@ -303,7 +305,7 @@ public class UrlBuilderTest { } @Test - public void slashEncodeTest(){ + public void slashEncodeTest() { // https://github.com/dromara/hutool/issues/1904 // 在query中,"/"是不可转义字符 // 见:https://www.rfc-editor.org/rfc/rfc3986.html#section-3.4 @@ -313,7 +315,7 @@ public class UrlBuilderTest { } @Test - public void addPathEncodeTest(){ + public void addPathEncodeTest() { final String url = UrlBuilder.of() .setScheme("https") .setHost("domain.cn") @@ -326,7 +328,7 @@ public class UrlBuilderTest { } @Test - public void addPathEncodeTest2(){ + public void addPathEncodeTest2() { // https://github.com/dromara/hutool/issues/1912 final String url = UrlBuilder.of() .setScheme("https") @@ -338,21 +340,21 @@ public class UrlBuilderTest { } @Test - public void percent2BTest(){ + public void percent2BTest() { final String url = "http://xxx.cn/a?Signature=3R013Bj9Uq4YeISzAs2iC%2BTVCL8%3D"; final UrlBuilder of = UrlBuilder.ofHttpWithoutEncode(url); Assert.assertEquals(url, of.toString()); } @Test - public void paramTest(){ + public void paramTest() { final String url = "http://ci.xiaohongshu.com/spectrum/c136c98aa2047babe25b994a26ffa7b492bd8058?imageMogr2/thumbnail/x800/format/jpg"; final UrlBuilder builder = UrlBuilder.ofHttp(url); Assert.assertEquals(url, builder.toString()); } @Test - public void fragmentTest(){ + public void fragmentTest() { // https://gitee.com/dromara/hutool/issues/I49KAL#note_8060874 final String url = "https://www.hutool.cn/#/a/b?timestamp=1640391380204"; final UrlBuilder builder = UrlBuilder.ofHttp(url); @@ -361,7 +363,7 @@ public class UrlBuilderTest { } @Test - public void fragmentAppendParamTest(){ + public void fragmentAppendParamTest() { // https://gitee.com/dromara/hutool/issues/I49KAL#note_8060874 final String url = "https://www.hutool.cn/#/a/b"; final UrlBuilder builder = UrlBuilder.ofHttp(url); @@ -370,7 +372,7 @@ public class UrlBuilderTest { } @Test - public void paramWithPlusTest(){ + public void paramWithPlusTest() { final String url = "http://127.0.0.1/?" + "Expires=1642734164&" + "security-token=CAIS+AF1q6Ft5B2yfSjIr5fYEeju1b1ggpPee2KGpjlgQtdfl43urjz2IHtKdXRvBu8Xs" + @@ -385,7 +387,7 @@ public class UrlBuilderTest { } @Test - public void issueI4Z2ETTest(){ + public void issueI4Z2ETTest() { // =是url参数值中的合法字符,但是某些URL强制编码了 final String url = "http://dsl-fd.dslbuy.com/fssc/1647947565522.pdf?" + "Expires=1647949365" + @@ -397,21 +399,21 @@ public class UrlBuilderTest { } @Test - public void issue2215Test(){ + public void issue2215Test() { final String url = "https://hutool.cn/v1/104303371/messages:send"; final String build = UrlBuilder.of(url).build(); Assert.assertEquals(url, build); } @Test - public void issuesI4Z2ETTest(){ + public void issuesI4Z2ETTest() { final String url = "http://hutool.cn/2022/03/09/123.zip?Expires=1648704684&OSSAccessKeyId=LTAI4FncgaVtwZGBnYHHi8ox&Signature=%2BK%2B%3D"; final String build = UrlBuilder.of(url, null).build(); Assert.assertEquals(url, build); } @Test - public void issueI50NHQTest(){ + public void issueI50NHQTest() { final String url = "http://127.0.0.1/devicerecord/list"; final HashMap params = new LinkedHashMap<>(); params.put("start", "2022-03-31 00:00:00"); @@ -425,12 +427,12 @@ public class UrlBuilderTest { } @Test - public void issue2242Test(){ + public void issue2242Test() { } @Test - public void issue2243Test(){ + public void issue2243Test() { // https://github.com/dromara/hutool/issues/2243 // 如果用户已经做了%编码,不应该重复编码 final String url = "https://hutool.cn/v1.0?privateNum=%2B8616512884988"; @@ -439,7 +441,7 @@ public class UrlBuilderTest { } @Test - public void issueI51T0VTest(){ + public void issueI51T0VTest() { // &自动转换为& final String url = "https://hutool.cn/a.mp3?Expires=1652423884&key=JMv2rKNc7Pz&sign=12zva00BpVqgZcX1wcb%2BrmN7H3E%3D"; final UrlBuilder of = UrlBuilder.of(url, null); @@ -464,7 +466,7 @@ public class UrlBuilderTest { } @Test - public void addPathTest(){ + public void addPathTest() { //https://gitee.com/dromara/hutool/issues/I5O4ML UrlBuilder.of().addPath(""); UrlBuilder.of().addPath("/"); From efe89848b09fda89cfd9fe8c01db5f98cc27c82e Mon Sep 17 00:00:00 2001 From: bwcx_jzy Date: Thu, 13 Oct 2022 15:44:27 +0800 Subject: [PATCH 3/5] fix UrlBuilder test --- .../src/test/java/cn/hutool/core/net/UrlBuilderTest.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) 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 8261c316e..5b9664164 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 @@ -19,7 +19,7 @@ public class UrlBuilderTest { UrlBuilder builder = UrlBuilder.of(); final String buildUrl = builder.setHost("www.hutool.cn").build(); Assert.assertEquals("http://www.hutool.cn/", buildUrl); - Assert.assertEquals(buildUrl, builder.getPortWithDefault(), 80); + Assert.assertEquals(buildUrl, 80, builder.getPortWithDefault()); } @Test @@ -28,9 +28,11 @@ public class UrlBuilderTest { String buildUrl = UrlBuilder.of().setScheme("http").setHost("192.168.1.1").setPort(8080).setWithEndTag(false).build(); Assert.assertEquals("http://192.168.1.1:8080", buildUrl); - buildUrl = UrlBuilder.of().setScheme("http").setHost("192.168.1.1").setPort(8080).addQuery("url", "http://192.168.1.1/test/1") + UrlBuilder urlBuilder = UrlBuilder.of(); + buildUrl = urlBuilder.setScheme("http").setHost("192.168.1.1").setPort(8080).addQuery("url", "http://192.168.1.1/test/1") .setWithEndTag(false).build(); Assert.assertEquals("http://192.168.1.1:8080?url=http://192.168.1.1/test/1", buildUrl); + Assert.assertEquals(buildUrl, 8080, urlBuilder.getPortWithDefault()); } @Test From 1ae03284e8df8350b32de58f41200d9d65535b53 Mon Sep 17 00:00:00 2001 From: xudeping Date: Thu, 13 Oct 2022 15:51:20 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E5=88=86=E5=89=B2=E6=B3=A8=E9=87=8A?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E6=B7=BB=E5=8A=A0=E7=94=9F=E5=BA=8F?= =?UTF-8?q?=E9=99=8D=E5=BA=8F=E5=88=86=E5=89=B2=E7=BA=BF=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/cn/hutool/core/util/PrimitiveArrayUtil.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/util/PrimitiveArrayUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/PrimitiveArrayUtil.java index 066c0498c..50a78a2c1 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/PrimitiveArrayUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/PrimitiveArrayUtil.java @@ -2667,7 +2667,7 @@ public class PrimitiveArrayUtil { return array; } - // ---------------------------------------------------------------------- shuffle + // ---------------------------------------------------------------------- swap /** * 交换数组中两个位置的值 @@ -2821,6 +2821,8 @@ public class PrimitiveArrayUtil { return array; } + // ---------------------------------------------------------------------- asc and desc + /** * 检查数组是否升序,即array[i] <= array[i+1],若传入空数组,则返回false * From bb265e71ba8ad7bcc8b36813eb40b7cbda79dc93 Mon Sep 17 00:00:00 2001 From: Looly Date: Thu, 13 Oct 2022 17:45:33 +0800 Subject: [PATCH 5/5] =?UTF-8?q?UrlBuilder=E5=A2=9E=E5=8A=A0getPortWithDefa?= =?UTF-8?q?ult=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f032dfe51..0bbfe7516 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ ------------------------------------------------------------------------------------------------------------- -# 5.8.9.M1 (2022-10-12) +# 5.8.9.M1 (2022-10-13) ### 🐣新特性 * 【core 】 DateUtil增加isLastDayOfMonth、getLastDayOfMonth方法(pr#824@Gitee) @@ -11,6 +11,7 @@ * 【core 】 CharUtil.isBlank添加Hangul Filler字符(issue#I5UGSQ@Gitee) * 【poi 】 优化合并单元格读取(issue#I5UJZ1@Gitee) * 【extra 】 增加QLExpress支持(issue#2653@Github) +* 【core 】 UrlBuilder增加getPortWithDefault方法(pr#835@Gitee) ### 🐞Bug修复 * 【poi 】 修复ExcelReader读取只有标题行报错问题(issue#I5U1JA@Gitee)