java.net.URI无法解析以数字开头的域名。

5

我有一个URI,http://my-host.1domain:1234/path,使用一个URI构造器抛出一个URISyntaxException异常:

new URI("http", /*userInfo*/null, /*host*/"my-host.1domain", 1234, "/path", /*query*/null, /*fragment*/null);

Exception in thread "main" java.net.URISyntaxException: Illegal character in hostname at index 15: http://my-host.1domain:1234/path
    at java.base/java.net.URI$Parser.fail(URI.java:2974)
    at java.base/java.net.URI$Parser.parseHostname(URI.java:3517)
    at java.base/java.net.URI$Parser.parseServer(URI.java:3358)
    at java.base/java.net.URI$Parser.parseAuthority(URI.java:3277)
    at java.base/java.net.URI$Parser.parseHierarchical(URI.java:3219)
    at java.base/java.net.URI$Parser.parse(URI.java:3175)
    at java.base/java.net.URI.<init>(URI.java:708)

但是使用另一个URI构造函数会正确解析:

// parses correctly
new URI("http", /*authority*/"my-host.1domain:1234", "/path", /*query*/null, /*fragment*/null);

在 OpenJDK 17.0.1 中测试过。我已检查过域名可以以数字开头。所以我误用了 URI 构造函数还是这是一个 bug?
(背景:Spring Web 中的 UriComponentsBuilder 调用了失败的构造函数,而 Spring Web 将其关闭为不是他们代码中的 bug

2
似乎是因为https://bugs.openjdk.java.net/browse/JDK-8188305。 - Kayaman
1个回答

3
在您的示例中,1domain 是一个顶级域名(TLD)。如果查看此规范,它规定:

顶级域名标签必须至少为两个字符长,可以长达63个字符 - 不包括任何前导或尾随句点(.) 。它必须仅由来自“字母”(A-Z)、“数字”(0-9)和“连字符”(-)的ASCII字符组成,并且必须以ASCII“字母”开头,不能以“连字符”结尾。大小写可以随意混合,因为DNS查找不区分大小写。


啊,谢谢。那么,第二个构造函数为什么会成功呢? - hertzsprung
1
好问题 ^) 我不知道.. - Alexey R.
1
@hertzsprung 第二个构造函数不解析权限。在构建后调用parseServerAuthority将生成您所期望的异常。 - VGR
1
@VGR 看起来你是对的!但是基于权限的构造函数的javadoc说明:“然后将生成的URI字符串解析,就像调用URI(String)构造函数一样,然后在结果上调用parseServerAuthority()方法;这可能会导致抛出URISyntaxException异常。”这似乎与观察到的行为相矛盾。 - hertzsprung
@hertzsprung 我同意,这似乎是一个 bug。不过,根据 Kayaman 评论中的链接,我认为 bug 是所有构造函数都应该允许域标签以数字开头。 - VGR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接