CSDN|给 JDK 报了一个P4 的 Bug,结果居然……( 二 )
所以问题发现了 , 我们的项目中依赖的第三方 httpclient包底层用到了 java.net.URI , 恰好在 java.net.URI 中是不允许以下划线(_)作为 hostname字段的 。
即 uri.getHost 和 uri.toURL.getHost 居然能不相等 。
这是 JDK 的 Bug 吧?
有理由怀疑 , 这是 JDK 的 Bug 吧? 从官网上还真找到了关于包含下划线作为 hostname 的 bug 提交 issue , 戳这里 JDK-8132508 : Bug JDK-8029354 reproduces with underscore in hostname[3] , 然后发现该 "bug" reporter 的情况貌似跟我的差不多 , 只不过引爆bug的点不一样 。
该 "bug" reviewer 最后以 "Not an Issue" 关闭 , 给出的理由是:
RFC 952 disallows _ underscores in hostnames. So, this is not a bug.
确实 , rfc952[4] 明确明确说了域名只能由 字母 (A-Z)、 数字(0-9)、 减号 (-) 和 点 (.) 组成 。
那 OK 吧 , 既然明确规定了 hostname 不能包含下划线 , 为啥 java.net.URL确允许呢?
造成java.net.URI和java.net.URL在处理 hostname 时的标准不一致 , 且本身java.net.URI在构造的时候也带了 "有色"眼镜 , 同一个url字符串 通过静态方法java.net.URI.create(String) 或者通过带1个参数的构造方法 java.net.URI(String) 都能成功构造出 URI 的实例 , 但通过带4个参数的构造方法就不能构造了 。
要知道 , 在 coding 过程中 , 尽早反馈异常信息更有利于软件开发持续迭代的过程 。 我们在开发过程中也应该遵循这一点原则 。
于是我就去 JDK 官网提交了一个 bug , 大意是说 java.net.URI 和 java.net.URL 在处理 hostname 的时候标准不一致 , 容易使开发人员埋藏一些潜在的 bug , 同时也还把这个问题反馈到 stackoverflow[5] 了
I am wondering, if hostname with underscore is not valid, why the result is differrent between java.net.URI and java.net.URL? Is it a bug or a feature? Here is the example.
java.net.URL url = new java.net.URL("http://test_1.tanglei.name");
System.out.println(url.getHost); //test_1.tanglei.name
java.net.URI uri = new java.net.URI("http://test_1.tanglei.name");
System.out.println(uri.getHost); //null
这个 JDK bug issue 详细信息见 JDK-8170265 : underscore is allowed in java.net.URL while not in java.net.URI[6] , openjdk JDK-8170265[7]
本文插图
经过初步 Review , 被认为是一个 P4 的 Bug , 说的是 java.net.URL 遵循的是 RFC 2396 规范 , 确实不允许含有下划线的 hostname , java.net.URI 做到了 ,而 java.net.URL 没有做到 。
本文插图
重点来了 , 然后 , 却被另外一个 Reviewer 直接个毙了 。 给出的原因是 java.net.URL 构造方法中 , API 文档中说了本来也不会做验证即 No validation of the inputs is performed by this constructor. 在线 api doc 戳这里[8] (可以点连接 , 进去搜索关键字 "No validation")
本文插图
当初没有收到及时反馈 , 就没有来得及怼回去 。其实就算 "No validation of the inputs is performed by this constructor." 是合理的 , 里面也只有3个构造函数有这样的说明 , 按照这样的逻辑是不是说另外的构造函数有验证呢..... (示例中的默认的构造函数都没有说呀) 这里有 java.net.URL 的源码[9] , 看兴趣的同学可以看看 。恩 , 以上就是结论了 。不过 , 反正我自己感觉目前 Java API 关于这里的设计不太合理 , 欢迎大家讨论 。我在SO提问的这个回答[10]比较有意思 , 哈哈 。The review is somewhat terse, but the reviewer's point is the URL constructor is behaving in accordance with its specification. Since the specification explicitly states that no validation is performed, this is not a bug in the code. This is indisputable.
推荐阅读
- 中介网|一个网站可以有多个域名吗
- 聚韬品牌策划公司|如何准备一个好的商业计划书,10分钟打动投资人?
- 影视咔咔秀|谁是第一个猎魔人?网飞公司宣布将推出《猎魔人:血源》前传
- 声学|OPPO放大招!一个是视听盛宴,一个是声学旗舰!这才是国产的实力
- 亿万|iPhone11狂降700元!亿万果粉猝不及防,同时还有一个坏消息
- 富前程社群裂变|富船长:Persona用户角色模型——一个找痛点神器
- 阿威的厨房故事|老外感叹:中国最令人敬佩的一点,就是一个华为就能让所有人团结
- 知闻网|用了一个月荣耀X10,谈谈真实感受,给大家购机提供参考
- |临床数据缺乏标准化、科研转化难?专家提议造一个“医疗科研领域的淘宝”
- |双11后第一个传破产的品牌,怎么混成这样了?
