在通过TomcatWebServer#stop()进行嵌入式Tomcat关机过程中,我注意到我的一个Spring Boot应用程序中有一个特殊的URISyntaxException被 suppress --在调试后,我发现源代码是这样的:

https://github.com/openjdk/jdk/blob/master/src/java.base/share/classes/java/net/SocksSocketImpl.java#L306

(这发生在我的Eclipse Temurin 17.0.8.1上,但我try 了其他Java版本,它看起来基本相同)

基本上,无论我多么努力地盯着它,对于IPv6(我的用例)来说,这段代码看起来像是坏了.

  • epoint.getHostString()表示有效的IPv6,不带大括号(例如fd00:baba:babe:0:0:0:0:862)
  • 以下代码检测IPv6 epoint并添加大括号[fd00:baba:babe:0:0:0:0:862]
  • ParseUtil.encodePath(host)host%5bfd00:baba:babe:0:0:0:0:862%5d进行编码-这是有问题的,因为稍后通过URI解析将无法区分主机名和端口,但本身不应该导致异常
  • 然后将其与模式/端口连接并给出例如socket://%5fd00:baba:babe:0:0:0:0:862%5d:55507-甚至更多的问题,因为现在它对人眼和可能对new URI输入解析器来说都看起来更麻烦,
  • 然而,new URIc-tor构造了一个URI,其编码的主机名和端口聚集在一起,分别为authorityhost == nullport == -1

为了对基于IPv6的主机正常工作,new URI期望non-encoded IPv6地址with required literal braces,即[fd00:baba:babe:0:0:0:0:862]

简单的复制 case :

    URI uri = new URI("socket://[fd00:baba:babe:0:0:0:0:862]:55507");
    System.out.println(uri.getHost()); // [fd00:a89f:8b41:0:0:0:0:862] - OK
    uri = new URI("socket://%5fd00:baba:babe:0:0:0:0:862%5d:55507");
    System.out.println(uri.getHost()); // null - port is -1, everything got clumped in authority
    uri = new URI("socket://fd00:baba:babe:0:0:0:0:862:55507");
    System.out.println(uri.getHost()); // null - port is -1, everything got clumped in authority

我认为拥有host == null应该会在以后导致SocksSocketImpl崩溃,但令人惊讶的是,在唯一实际使用uri的地方,即调用DefaultProxySelector#select(URI uri)时,我发现了一个无关的解决方法……这被明确描述为not for this case,但允许代码不会失败!https://github.com/openjdk/jdk/blob/jdk-10%2B24/src/java.base/share/classes/sun/net/spi/DefaultProxySelector.java#L168(即,如果不是几十年前的黑客解决办法for completely unrelated cases-国际域名和带下划线的域名,则此代码would实际上在正常情况下崩溃).

我是否遗漏了一些明显的东西,或者它是stdlib本身中的堆叠错误(因此应该向upstream 报告)?

推荐答案

Java相关问答推荐

使用log 4j2格式的Hibernate 显示SQL日志(log)

H2弹簧靴试验跌落台

如果一个子类没有构造函数,超类也没有构造函数,那么为什么我可以构造子类的实例呢?

neo4j java驱动程序是否会在错误发生时自动回滚事务?

在for—each循环中的AnimationTimer中的if语句'

RESTful框架类字段是安全的还是不安全的

对某一Hyroby控制器禁用@cacheable

在Java中,在单个逻辑行中连接列表和单个元素的正确方法是什么?

在Spring Boot应用程序中导致";MediaTypeNotSupportdException&qot;的映像上载

如何使用log4j2(Json)记录由";异常引起的所有";?

如何将Java文档配置为在指定的项目根目录中生成?

当b是一个字节并且在Java中值为-1时,为什么b>;>;>;1总是等于-1?

如何配置空手道以使用FeignClient或RestTemplate代替ApacheHttpClient

对从Spring Boot 3.1.5升级到3.2.0的方法的查询验证失败

如何对存储为字符串的大数字数组进行排序?

如何显示新布局

message.acknowledge()没有';在使用Spring Boot在ActiveMQ中读取消息后,t将消息出列

关于正则表达式的一个特定问题,该问题与固定宽度负向后看有关

在外部类和内部类之间,当调用外部类内部或外部的主方法时,它们的静态初始化程序的运行顺序不同

找不到 jar 文件系统提供程序try 使用 jdeps 和 jlink 创建收缩 Java 映像来运行 Minecraft