From dbcbf53bca2f7ea1296abfb77f0d04360058f3a1 Mon Sep 17 00:00:00 2001 From: Looly Date: Sat, 10 Apr 2021 20:35:07 +0800 Subject: [PATCH] fix bugs --- CHANGELOG.md | 4 ++- .../java/cn/hutool/core/date/DateUtil.java | 8 +++-- .../cn/hutool/core/date/DateUtilTest.java | 17 ++++++++++ .../main/java/cn/hutool/http/HttpRequest.java | 2 +- .../main/java/cn/hutool/http/HttpStatus.java | 34 +++++++++++++++++-- 5 files changed, 58 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f1da89249..08ac08e01 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ ------------------------------------------------------------------------------------------------------------- -# 5.6.3 (2021-04-08) +# 5.6.3 (2021-04-10) ### 新特性 * 【core 】 修改数字转换的实现,增加按照指定端序转换(pr#1492@Github) @@ -17,12 +17,14 @@ * 【cache 】 EnumUtil使用LinkedHashMap(pr#304@Gitee) * 【crypto 】 SymmetricCrypto支持大量数据加密解密(pr#1497@Gitee) * 【http 】 SoapClient增加针对不同协议的头信息(pr#305@Gitee) +* 【http 】 HttpRequest支持307、308状态码识别(issue#1504@Gitee) ### Bug修复 * 【core 】 修复Validator.isUrl()传空返回true(issue#I3ETTY@Gitee) * 【db 】 修复数据库driver根据url的判断识别错误问题(issue#I3EWBI@Gitee) * 【json 】 修复JSONStrFormatter换行多余空行问题(issue#I3FA8B@Gitee) * 【core 】 修复UrlPath中的+被转义为空格%20的问题(issue#1501@Github) +* 【core 】 修复DateUtil.parse方法对UTC时间毫秒少于3位不识别问题(issue#1503@Github) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java b/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java index c9de48257..d10f3cdc0 100644 --- a/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java @@ -822,8 +822,12 @@ public class DateUtil extends CalendarUtil { if (length == DatePattern.UTC_PATTERN.length() - 4) { // 格式类似:2018-09-13T05:34:31Z,-4表示减去4个单引号的长度 return parse(utcString, DatePattern.UTC_FORMAT); - } else if (length == DatePattern.UTC_MS_PATTERN.length() - 4) { - // 格式类似:2018-09-13T05:34:31.999Z,-4表示减去4个单引号的长度 + } + + final int patternLength = DatePattern.UTC_MS_PATTERN.length(); + // 格式类似:2018-09-13T05:34:31.999Z,-4表示减去4个单引号的长度 + // -4 ~ -6范围表示匹配毫秒1~3位的情况 + if (length <= patternLength - 4 && length >= patternLength - 6) { return parse(utcString, DatePattern.UTC_MS_FORMAT); } } else { diff --git a/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java index 068a95063..0e530a269 100644 --- a/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/date/DateUtilTest.java @@ -559,6 +559,23 @@ public class DateUtilTest { Assert.assertEquals("2018-09-13 13:34:39", dateStr); } + @Test + public void parseUTCTest2(){ + // issue1503@Github + // 检查不同毫秒长度都可以正常匹配 + String utcTime="2021-03-30T12:56:51.3Z"; + DateTime parse = DateUtil.parseUTC(utcTime); + Assert.assertEquals("2021-03-30 12:56:51", parse.toString()); + + utcTime="2021-03-30T12:56:51.34Z"; + parse = DateUtil.parseUTC(utcTime); + Assert.assertEquals("2021-03-30 12:56:51", parse.toString()); + + utcTime="2021-03-30T12:56:51.345Z"; + parse = DateUtil.parseUTC(utcTime); + Assert.assertEquals("2021-03-30 12:56:51", parse.toString()); + } + @Test public void parseCSTTest(){ String dateStr = "Wed Sep 16 11:26:23 CST 2009"; diff --git a/hutool-http/src/main/java/cn/hutool/http/HttpRequest.java b/hutool-http/src/main/java/cn/hutool/http/HttpRequest.java index a4986b809..deed4a165 100644 --- a/hutool-http/src/main/java/cn/hutool/http/HttpRequest.java +++ b/hutool-http/src/main/java/cn/hutool/http/HttpRequest.java @@ -1126,7 +1126,7 @@ public class HttpRequest extends HttpBase { } if (responseCode != HttpURLConnection.HTTP_OK) { - if (responseCode == HttpURLConnection.HTTP_MOVED_TEMP || responseCode == HttpURLConnection.HTTP_MOVED_PERM || responseCode == HttpURLConnection.HTTP_SEE_OTHER) { + if (HttpStatus.isRedirected(responseCode)) { setUrl(httpConnection.header(Header.LOCATION)); if (redirectCount < this.maxRedirectCount) { redirectCount++; diff --git a/hutool-http/src/main/java/cn/hutool/http/HttpStatus.java b/hutool-http/src/main/java/cn/hutool/http/HttpStatus.java index bd197d001..f8e3fad55 100644 --- a/hutool-http/src/main/java/cn/hutool/http/HttpStatus.java +++ b/hutool-http/src/main/java/cn/hutool/http/HttpStatus.java @@ -2,15 +2,15 @@ package cn.hutool.http; /** * HTTP状态码 - * + * * @author Looly * @see java.net.HttpURLConnection * */ public class HttpStatus { - + /* 2XX: generally "OK" */ - + /** * HTTP Status-Code 200: OK. */ @@ -78,6 +78,18 @@ public class HttpStatus { */ public static final int HTTP_USE_PROXY = 305; + /** + * HTTP 1.1 Status-Code 307: Temporary Redirect.
+ * 见:RFC-7231 + */ + public static final int HTTP_TEMP_REDIRECT = 307; + + /** + * HTTP 1.1 Status-Code 308: Permanent Redirect 永久重定向
+ * 见:RFC-7231 + */ + public static final int HTTP_PERMANENT_REDIRECT = 308; + /* 4XX: client error */ /** @@ -191,4 +203,20 @@ public class HttpStatus { * HTTP Status-Code 505: HTTP Version Not Supported. */ public static final int HTTP_VERSION = 505; + + /** + * 是否为重定向状态码 + * @param responseCode 被检查的状态码 + * @return 是否为重定向状态码 + * @since 5.6.3 + */ + public static boolean isRedirected(int responseCode){ + return responseCode == HTTP_MOVED_PERM + || responseCode == HTTP_MOVED_TEMP + || responseCode == HTTP_SEE_OTHER + // issue#1504@Github,307和308是RFC 7538中http 1.1定义的规范 + || responseCode == HTTP_TEMP_REDIRECT + || responseCode == HTTP_PERMANENT_REDIRECT; + + } }