!835 add UrlBuilder getPortWithDefault

Merge pull request !835 from 不忘初心/v5-dev
This commit is contained in:
Looly 2022-10-13 09:41:56 +00:00 committed by Gitee
commit 364d6a2560
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
2 changed files with 50 additions and 32 deletions

View File

@ -291,6 +291,20 @@ public final class UrlBuilder implements Builder<String> {
return port; return port;
} }
/**
* 获取端口如果未自定义返回协议默认端口
*
* @return 端口
*/
public int getPortWithDefault() {
int port = getPort();
if (port > 0) {
return port;
}
URL url = this.toURL();
return url.getDefaultPort();
}
/** /**
* 设置端口默认-1 * 设置端口默认-1
* *

View File

@ -16,19 +16,23 @@ public class UrlBuilderTest {
@Test @Test
public void buildTest() { 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("http://www.hutool.cn/", buildUrl);
Assert.assertEquals(buildUrl, 80, builder.getPortWithDefault());
} }
@Test @Test
public void buildWithoutSlashTest(){ public void buildWithoutSlashTest() {
// https://github.com/dromara/hutool/issues/2459 // https://github.com/dromara/hutool/issues/2459
String buildUrl = UrlBuilder.of().setScheme("http").setHost("192.168.1.1").setPort(8080).setWithEndTag(false).build(); 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); 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(); .setWithEndTag(false).build();
Assert.assertEquals("http://192.168.1.1:8080?url=http://192.168.1.1/test/1", buildUrl); Assert.assertEquals("http://192.168.1.1:8080?url=http://192.168.1.1/test/1", buildUrl);
Assert.assertEquals(buildUrl, 8080, urlBuilder.getPortWithDefault());
} }
@Test @Test
@ -204,7 +208,7 @@ public class UrlBuilderTest {
} }
@Test @Test
public void weixinUrlTest(){ public void weixinUrlTest() {
final String urlStr = "https://mp.weixin.qq.com/s?" + final String urlStr = "https://mp.weixin.qq.com/s?" +
"__biz=MzI5NjkyNTIxMg==" + "__biz=MzI5NjkyNTIxMg==" +
"&amp;mid=100000465" + "&amp;mid=100000465" +
@ -214,15 +218,15 @@ public class UrlBuilderTest {
final UrlBuilder builder = UrlBuilder.ofHttp(urlStr, CharsetUtil.CHARSET_UTF_8); final UrlBuilder builder = UrlBuilder.ofHttp(urlStr, CharsetUtil.CHARSET_UTF_8);
// 原URL中的&amp;替换为& // 原URL中的&amp;替换为&
Assert.assertEquals("https://mp.weixin.qq.com/s?" + Assert.assertEquals("https://mp.weixin.qq.com/s?" +
"__biz=MzI5NjkyNTIxMg==" + "__biz=MzI5NjkyNTIxMg==" +
"&mid=100000465&idx=1" + "&mid=100000465&idx=1" +
"&sn=1044c0d19723f74f04f4c1da34eefa35" + "&sn=1044c0d19723f74f04f4c1da34eefa35" +
"&chksm=6cbda3a25bca2ab4516410db6ce6e125badaac2f8c5548ea6e18eab6dc3c5422cb8cbe1095f7", "&chksm=6cbda3a25bca2ab4516410db6ce6e125badaac2f8c5548ea6e18eab6dc3c5422cb8cbe1095f7",
builder.toString()); builder.toString());
} }
@Test @Test
public void endWithSlashTest(){ public void endWithSlashTest() {
// 原URL中以/结尾则这个规则需保留issue#I1G44J@Gitee // 原URL中以/结尾则这个规则需保留issue#I1G44J@Gitee
final String today = DateUtil.date().toString("yyyyMMdd"); final String today = DateUtil.date().toString("yyyyMMdd");
final String getWorkDayUrl = "https://tool.bitefu.net/jiari/?info=1&d=" + today; final String getWorkDayUrl = "https://tool.bitefu.net/jiari/?info=1&d=" + today;
@ -231,19 +235,19 @@ public class UrlBuilderTest {
} }
@Test @Test
public void blankEncodeTest(){ public void blankEncodeTest() {
final UrlBuilder urlBuilder = UrlBuilder.ofHttp("http://a.com/aaa bbb.html", CharsetUtil.CHARSET_UTF_8); 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()); Assert.assertEquals("http://a.com/aaa%20bbb.html", urlBuilder.toString());
} }
@Test @Test
public void dotEncodeTest(){ public void dotEncodeTest() {
final UrlBuilder urlBuilder = UrlBuilder.ofHttp("http://xtbgyy.digitalgd.com.cn/ebus/../../..", CharsetUtil.CHARSET_UTF_8); 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()); Assert.assertEquals("http://xtbgyy.digitalgd.com.cn/ebus/../../..", urlBuilder.toString());
} }
@Test @Test
public void multiSlashTest(){ public void multiSlashTest() {
//issue#I25MZL某些URL中有多个斜杠此为合法路径 //issue#I25MZL某些URL中有多个斜杠此为合法路径
final UrlBuilder urlBuilder = UrlBuilder.ofHttp("https://hutool.cn//file/test.jpg", CharsetUtil.CHARSET_UTF_8); 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()); Assert.assertEquals("https://hutool.cn//file/test.jpg", urlBuilder.toString());
@ -264,7 +268,7 @@ public class UrlBuilderTest {
} }
@Test @Test
public void encodePathTest(){ public void encodePathTest() {
// Path中的某些符号无需转义比如= // Path中的某些符号无需转义比如=
final String urlStr = "http://hq.sinajs.cn/list=sh600519"; final String urlStr = "http://hq.sinajs.cn/list=sh600519";
final UrlBuilder urlBuilder = UrlBuilder.ofHttp(urlStr, CharsetUtil.CHARSET_UTF_8); final UrlBuilder urlBuilder = UrlBuilder.ofHttp(urlStr, CharsetUtil.CHARSET_UTF_8);
@ -272,7 +276,7 @@ public class UrlBuilderTest {
} }
@Test @Test
public void encodePathTest2(){ public void encodePathTest2() {
// https://gitee.com/dromara/hutool/issues/I4RA42 // https://gitee.com/dromara/hutool/issues/I4RA42
// Path中`:`在第一个segment需要转义之后的不需要 // Path中`:`在第一个segment需要转义之后的不需要
final String urlStr = "https://hutool.cn/aa/bb/Pre-K,Kindergarten,First,Second,Third,Fourth,Fifth/Page:3"; final String urlStr = "https://hutool.cn/aa/bb/Pre-K,Kindergarten,First,Second,Third,Fourth,Fifth/Page:3";
@ -281,7 +285,7 @@ public class UrlBuilderTest {
} }
@Test @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 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); final UrlBuilder urlBuilder = UrlBuilder.of(url);
@ -291,7 +295,7 @@ public class UrlBuilderTest {
} }
@Test @Test
public void fragmentEncodeTest(){ public void fragmentEncodeTest() {
// https://gitee.com/dromara/hutool/issues/I49KAL // https://gitee.com/dromara/hutool/issues/I49KAL
// https://stackoverflow.com/questions/26088849/url-fragment-allowed-characters // https://stackoverflow.com/questions/26088849/url-fragment-allowed-characters
final String url = "https://hutool.cn/docs/#/?id=简介"; final String url = "https://hutool.cn/docs/#/?id=简介";
@ -303,7 +307,7 @@ public class UrlBuilderTest {
} }
@Test @Test
public void slashEncodeTest(){ public void slashEncodeTest() {
// https://github.com/dromara/hutool/issues/1904 // https://github.com/dromara/hutool/issues/1904
// 在query中"/"是不可转义字符 // 在query中"/"是不可转义字符
// https://www.rfc-editor.org/rfc/rfc3986.html#section-3.4 // https://www.rfc-editor.org/rfc/rfc3986.html#section-3.4
@ -313,7 +317,7 @@ public class UrlBuilderTest {
} }
@Test @Test
public void addPathEncodeTest(){ public void addPathEncodeTest() {
final String url = UrlBuilder.of() final String url = UrlBuilder.of()
.setScheme("https") .setScheme("https")
.setHost("domain.cn") .setHost("domain.cn")
@ -326,7 +330,7 @@ public class UrlBuilderTest {
} }
@Test @Test
public void addPathEncodeTest2(){ public void addPathEncodeTest2() {
// https://github.com/dromara/hutool/issues/1912 // https://github.com/dromara/hutool/issues/1912
final String url = UrlBuilder.of() final String url = UrlBuilder.of()
.setScheme("https") .setScheme("https")
@ -338,21 +342,21 @@ public class UrlBuilderTest {
} }
@Test @Test
public void percent2BTest(){ public void percent2BTest() {
final String url = "http://xxx.cn/a?Signature=3R013Bj9Uq4YeISzAs2iC%2BTVCL8%3D"; final String url = "http://xxx.cn/a?Signature=3R013Bj9Uq4YeISzAs2iC%2BTVCL8%3D";
final UrlBuilder of = UrlBuilder.ofHttpWithoutEncode(url); final UrlBuilder of = UrlBuilder.ofHttpWithoutEncode(url);
Assert.assertEquals(url, of.toString()); Assert.assertEquals(url, of.toString());
} }
@Test @Test
public void paramTest(){ public void paramTest() {
final String url = "http://ci.xiaohongshu.com/spectrum/c136c98aa2047babe25b994a26ffa7b492bd8058?imageMogr2/thumbnail/x800/format/jpg"; final String url = "http://ci.xiaohongshu.com/spectrum/c136c98aa2047babe25b994a26ffa7b492bd8058?imageMogr2/thumbnail/x800/format/jpg";
final UrlBuilder builder = UrlBuilder.ofHttp(url); final UrlBuilder builder = UrlBuilder.ofHttp(url);
Assert.assertEquals(url, builder.toString()); Assert.assertEquals(url, builder.toString());
} }
@Test @Test
public void fragmentTest(){ public void fragmentTest() {
// https://gitee.com/dromara/hutool/issues/I49KAL#note_8060874 // https://gitee.com/dromara/hutool/issues/I49KAL#note_8060874
final String url = "https://www.hutool.cn/#/a/b?timestamp=1640391380204"; final String url = "https://www.hutool.cn/#/a/b?timestamp=1640391380204";
final UrlBuilder builder = UrlBuilder.ofHttp(url); final UrlBuilder builder = UrlBuilder.ofHttp(url);
@ -361,7 +365,7 @@ public class UrlBuilderTest {
} }
@Test @Test
public void fragmentAppendParamTest(){ public void fragmentAppendParamTest() {
// https://gitee.com/dromara/hutool/issues/I49KAL#note_8060874 // https://gitee.com/dromara/hutool/issues/I49KAL#note_8060874
final String url = "https://www.hutool.cn/#/a/b"; final String url = "https://www.hutool.cn/#/a/b";
final UrlBuilder builder = UrlBuilder.ofHttp(url); final UrlBuilder builder = UrlBuilder.ofHttp(url);
@ -370,7 +374,7 @@ public class UrlBuilderTest {
} }
@Test @Test
public void paramWithPlusTest(){ public void paramWithPlusTest() {
final String url = "http://127.0.0.1/?" + final String url = "http://127.0.0.1/?" +
"Expires=1642734164&" + "Expires=1642734164&" +
"security-token=CAIS+AF1q6Ft5B2yfSjIr5fYEeju1b1ggpPee2KGpjlgQtdfl43urjz2IHtKdXRvBu8Xs" + "security-token=CAIS+AF1q6Ft5B2yfSjIr5fYEeju1b1ggpPee2KGpjlgQtdfl43urjz2IHtKdXRvBu8Xs" +
@ -385,7 +389,7 @@ public class UrlBuilderTest {
} }
@Test @Test
public void issueI4Z2ETTest(){ public void issueI4Z2ETTest() {
// =是url参数值中的合法字符但是某些URL强制编码了 // =是url参数值中的合法字符但是某些URL强制编码了
final String url = "http://dsl-fd.dslbuy.com/fssc/1647947565522.pdf?" + final String url = "http://dsl-fd.dslbuy.com/fssc/1647947565522.pdf?" +
"Expires=1647949365" + "Expires=1647949365" +
@ -397,21 +401,21 @@ public class UrlBuilderTest {
} }
@Test @Test
public void issue2215Test(){ public void issue2215Test() {
final String url = "https://hutool.cn/v1/104303371/messages:send"; final String url = "https://hutool.cn/v1/104303371/messages:send";
final String build = UrlBuilder.of(url).build(); final String build = UrlBuilder.of(url).build();
Assert.assertEquals(url, build); Assert.assertEquals(url, build);
} }
@Test @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 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(); final String build = UrlBuilder.of(url, null).build();
Assert.assertEquals(url, build); Assert.assertEquals(url, build);
} }
@Test @Test
public void issueI50NHQTest(){ public void issueI50NHQTest() {
final String url = "http://127.0.0.1/devicerecord/list"; final String url = "http://127.0.0.1/devicerecord/list";
final HashMap<String, Object> params = new LinkedHashMap<>(); final HashMap<String, Object> params = new LinkedHashMap<>();
params.put("start", "2022-03-31 00:00:00"); params.put("start", "2022-03-31 00:00:00");
@ -425,12 +429,12 @@ public class UrlBuilderTest {
} }
@Test @Test
public void issue2242Test(){ public void issue2242Test() {
} }
@Test @Test
public void issue2243Test(){ public void issue2243Test() {
// https://github.com/dromara/hutool/issues/2243 // https://github.com/dromara/hutool/issues/2243
// 如果用户已经做了%编码不应该重复编码 // 如果用户已经做了%编码不应该重复编码
final String url = "https://hutool.cn/v1.0?privateNum=%2B8616512884988"; final String url = "https://hutool.cn/v1.0?privateNum=%2B8616512884988";
@ -439,7 +443,7 @@ public class UrlBuilderTest {
} }
@Test @Test
public void issueI51T0VTest(){ public void issueI51T0VTest() {
// &amp;自动转换为& // &amp;自动转换为&
final String url = "https://hutool.cn/a.mp3?Expires=1652423884&amp;key=JMv2rKNc7Pz&amp;sign=12zva00BpVqgZcX1wcb%2BrmN7H3E%3D"; final String url = "https://hutool.cn/a.mp3?Expires=1652423884&amp;key=JMv2rKNc7Pz&amp;sign=12zva00BpVqgZcX1wcb%2BrmN7H3E%3D";
final UrlBuilder of = UrlBuilder.of(url, null); final UrlBuilder of = UrlBuilder.of(url, null);
@ -464,7 +468,7 @@ public class UrlBuilderTest {
} }
@Test @Test
public void addPathTest(){ public void addPathTest() {
//https://gitee.com/dromara/hutool/issues/I5O4ML //https://gitee.com/dromara/hutool/issues/I5O4ML
UrlBuilder.of().addPath(""); UrlBuilder.of().addPath("");
UrlBuilder.of().addPath("/"); UrlBuilder.of().addPath("/");