今天,我将桌面上一直使用的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,或者强加忽略该问题,因为星期几是可选的冗余信息。

07-24 09:52
查看更多