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

Java HttpCookie.parse中的日期无效;行为应该是什么?,java,datetime,openjdk,specifications,Java,Datetime,Openjdk,Specifications,今天,我将桌面上使用的java从OracleJDK1.7更改为OpenJDK1.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) 到 然后我为我的一个项目运行了单元测试,之前成功运行的项目现在失败了。 该测试失败的原因如下: List<HttpC

今天,我将桌面上使用的java从OracleJDK1.7更改为OpenJDK1.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)

然后我为我的一个项目运行了单元测试,之前成功运行的项目现在失败了。 该测试失败的原因如下:

List<HttpCookie> cookies = 
        HttpCookie.parse("FOO=BAR; expires=Thu, 01-Jan-2020 00:00:10 GMT");
HttpCookie cookie = cookies.get(0);
我发现的问题是,cookie.getMaxAge()突然总是返回一个0,而不是预期的“大”值

结果我问了一个无效的问题:2020年1月1日是星期三,不是星期四。 我在单元测试中修复了这个错误(所以现在我请求“Wed,01-Jan-2020”,现在可以了)

对我来说,问题仍然是:在“输入不太好”的情况下,“应该”是什么行为

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

显然:

  • Oracle:可以解析日期,因此我们返回值。“一周中的某一天”只是一个“暗示”
  • OpenJDK:此日期不能存在,因为它是指定的,所以我们返回一个0
在这一点上有规范吗?

从Oracle中我们可以看到字符串必须是set-cookie()或set-cookie2()。您的字符串符合Netscape的建议

从Netscape提案中:

日期字符串的格式为:

Wdy, DD-Mon-YYYY HH:MM:SS GMT
这是基于RFC 822、RFC 850、RFC 1036和RFC 1123,唯一的法定时区是GMT,日期元素之间的分隔符必须是破折号

发件人:

5.2。语义学

如果包含,则星期几必须是日期规范中暗示的日期

因此,您的字符串不是一个集合cookie字符串

在以下情况下,解析方法应引发IllegalArgumentException:

标头字符串违反cookie规范的语法,或者cookie名称包含非法字符,或者cookie名称是cookie协议保留使用的令牌之一

星期几错误是对规范的语义违反,而不是语法违反,因此不必提出任何异常


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

“从OracleJDK1.7到OpenJDK1.7”?OpenJDK是Oracle开发的JDK——源代码,我正在将我的更改推到hg.OpenJDK.java.net,我正在为Oracle工作:-)是的,我理解这种混乱。我指的是你可以在这里下载的Oracle版本。这个“正确”的名字是什么?我会称之为OpenJDK。我不会。为了避免进一步的混淆,我添加了这两个版本的版本信息。如果1.7.0_25接受的日期名称与给定日期不符,那么在我看来,1.7.0_25有一个bug,该bug显然已在1.7.0_65中更正。分享和享受。
cookie.getMaxAge();
Wdy, DD-Mon-YYYY HH:MM:SS GMT