HttpCookie.parse中的日期无效;应该是什么行为?

时间:2014-08-15 22:18:19

标签: java datetime openjdk specifications

今天我将我在桌面上使用的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而不是预期的&#39;大&#39;值。

事实证明,我提出了一个无效的问题:2020年1月1日是星期三,而不是星期四。 我在单元测试中修正了这个错误(所以现在我要求&#34; Wed,01-Jan-2020&#34;现在可以了。)

对我来说问题仍然存在:什么&#39;应该&#39;是不是那么好的输入&#39;

的行为

我在这里看到的这两种行为都有一些验证。

显然:

  • Oracle:可以解析日期,以便返回值。一周中的某一天&#39;只是一个提示&#39;。
  • OpenJDK:此日期不能按照指定的那样存在,因此我们返回0

关于这一点是否有规范?

1 个答案:

答案 0 :(得分: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。语义

     

如果包含,则星期几必须是日期规范隐含的日期。

所以你的字符串不是set-cookie字符串。

如果符合以下情况,则parse方法应抛出IllegalArgumentException:

  

标题字符串违反了cookie规范的语法,或者cookie名称包含非法字符,或者cookie名称是cookie协议保留的标记之一

星期几错误是对规范的语义违规,而不是语法错误,因此不必引发异常。

总之,未定义解析方法遇到错误星期日期的行为。规范应该强制引发IllegalArgumentException,要么强制忽略问题,因为星期几是可选的冗余信息。