今天我将我在桌面上使用的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;
的行为我在这里看到的这两种行为都有一些验证。
显然:
关于这一点是否有规范?
答案 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,要么强制忽略问题,因为星期几是可选的冗余信息。