今天,我将桌面上一直使用的Java从Oracle JDK 1.7更改为OpenJDK 1.7。
所以我从
java version "1.7.0_25"
Java(TM) SE Runtime Environment (build 1.7.0_25-b15)
Java HotSpot(TM) 64-Bit Server VM (build 23.25-b01, mixed mode)
至
java version "1.7.0_65"
OpenJDK Runtime Environment (rhel-2.5.1.2.el6_5-x86_64 u65-b17)
OpenJDK 64-Bit Server VM (build 24.65-b04, mixed mode)
然后,我为我的一个项目运行了单元测试,并且之前成功运行的单元失败了。
有问题的测试失败是这样的:
List<HttpCookie> cookies =
HttpCookie.parse("FOO=BAR; expires=Thu, 01-Jan-2020 00:00:10 GMT");
HttpCookie cookie = cookies.get(0);
然后使用来自
cookie.getMaxAge();
我发现的问题是,突然cookie.getMaxAge()总是返回0而不是预期的“大”值。
事实证明,我提出了一个无效的问题:2020年1月1日是星期三,而不是星期四。
我在单元测试中修复了此错误(所以现在我要求输入“ Wed,01-Jan-2020”,现在可以使用了)。
对我来说,问题仍然存在:如果“输入的信息不那么好”,行为应该是什么?
我在这里看到的两种行为都有一些验证。
显然:
Oracle:日期可以被解析,所以我们返回值。 “星期几”只是“提示”。
OpenJDK:由于指定的日期不存在,因此我们返回0
关于这一点有规范吗?
最佳答案
从Oracle javadoc中,我们看到该字符串必须是set-cookie(Netscape proposal)或set-cookie2(RFC 2965)。您的字符串遵循Netscape提案。
根据Netscape提案:
日期字符串的格式为:
Wdy, DD-Mon-YYYY HH:MM:SS GMT
它基于RFC 822,RFC 850,RFC 1036和RFC 1123,不同之处在于,唯一的合法时区是GMT,日期元素之间的分隔符必须是破折号。
从RFC 822:
5.2。 SEMANTICS
如果包含,则星期几必须是日期规范所隐含的日期。
因此,您的字符串不是set-cookie字符串。
如果满足以下条件,则parse方法应引发IllegalArgumentException:
标头字符串违反cookie规范的语法,或者cookie名称包含非法字符,或者cookie名称是保留供cookie协议使用的令牌之一
星期几错误是对规范的一种语义违反,而不是一种语法上的违反,因此不必提出任何例外。
总之,没有定义分析方法遇到日期错误的星期几的行为。规范应该强加引发一个IllegalArgumentException,或者强加忽略该问题,因为星期几是可选的冗余信息。