-1

我正在运行一个客户端,向MockServer发出一些请求。当使用其 IPv4 地址调用 MockServer 时,一切正常,但是当通过 IPv6 MockServer 调用它时会抛出异常:

    021-07-23 13:57:39 5.11.1 SEVERE 8889 exception processing request:

  {
    "method" : "GET",
    "path" : "/mypath",
    "headers" : {
      "Host" : [ "[2a01:c22:cc09:b600:50e7:2959:9dda:7aa8]:8889" ],
      "User-Agent" : [ "Go-http-client/1.1" ],
      "Accept-Encoding" : [ "gzip" ],
      "content-length" : [ "0" ]
    },
    "keepAlive" : true,
    "secure" : true
  }

 error:

  For input string: "c22"
 
java.lang.NumberFormatException: For input string: "c22"
       at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
       at java.base/java.lang.Integer.parseInt(Integer.java:652)
       at java.base/java.lang.Integer.parseInt(Integer.java:770)
       at org.mockserver.model.HttpRequest.socketAddressFromHostHeader(HttpRequest.java:1036)
       at org.mockserver.client.NettyHttpClient.sendRequest(NettyHttpClient.java:70)
       at org.mockserver.mock.action.http.HttpActionHandler.processAction(HttpActionHandler.java:216)
       at org.mockserver.netty.HttpRequestHandler.channelRead0(HttpRequestHandler.java:151)
       at org.mockserver.netty.HttpRequestHandler.channelRead0(HttpRequestHandler.java:48)
       at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:99)
       at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
       at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
       at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
       at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436)
       at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103)
       at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251)
       at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
       at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
       at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
       at org.mockserver.dashboard.DashboardWebSocketHandler.channelRead(DashboardWebSocketHandler.java:141)
       at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
       at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
       at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
       at org.mockserver.closurecallback.websocketregistry.CallbackWebSocketServerHandler.channelRead(CallbackWebSocketServerHandler.java:55)
       at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
       at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
       at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
       at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103)
       at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
       at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
       at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
       at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103)
       at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
       at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
       at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
       at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436)
       at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:324)
       at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:296)
       at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251)
       at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
       at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
       at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
       at org.mockserver.netty.unification.PortUnificationHandler.switchToHttp(PortUnificationHandler.java:260)
       at org.mockserver.netty.unification.PortUnificationHandler.decode(PortUnificationHandler.java:138)
       at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:501)
       at io.netty.handler.codec.ReplayingDecoder.callDecode(ReplayingDecoder.java:366)
       at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:276)
       at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
       at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
       at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
       at io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1518)
       at io.netty.handler.ssl.SslHandler.decodeJdkCompatible(SslHandler.java:1267)
       at io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1314)
       at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:501)
       at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:440)
       at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:276)
       at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
       at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
       at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
       at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
       at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
       at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
       at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
       at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163)
       at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:714)
       at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:650)
       at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:576)
       at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493)
       at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
        at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
        at java.base/java.lang.Thread.run(Thread.java:834)

看起来 MockServer 在解析主机和端口时存在一些问题。甚至可以将 MockServer 与 IPv6 一起使用吗?

4

1 回答 1

0

当您使用端口或 URI 时,有一些 RFC 解释了您将 IPv6 地址括在方括号 ([和) 中。]例如,RFC 4038,IPv6 过渡的应用方面

5.1 . IP 地址的表示格式

许多应用程序使用 IP 地址来识别网络节点并建立到目标地址的连接。例如,使用
客户端/服务器模型,客户端通常需要一个 IP 地址作为
应用程序参数来连接到服务器。该 IP 地址
通常以字符串的形式提供。
为 IP 地址移植表示格式时存在两个问题:
分配的内存和表示格式的管理。

通常,分配用于以字符串形式包含 IPv4 地址
表示的内存无法包含 IPv6 地址。
应修改应用程序以防止
较大的 IPv6 地址可能导致缓冲区溢出。

IPv4 和 IPv6 不使用相同的表示格式。IPv4 使用点 (.) 分隔以十进制表示法编写的四个八位字节,而
IPv6 使用冒号 (:) 分隔以
十六进制表示法编写的每对八位位组 [RFC3513]。例如,如果必须能够
指定带有地址的端口号(见下文),则
可能需要将地址放在方
括号 [TextRep] 内。

当输入实际上是 IP 地址和端口号的组合时,IP 地址解析器会出现一个特殊问题。对于 IPv4,这些通常与冒号相结合;例如,“192.0.2.1:80”。
但是,这种方法在 IPv6 中会产生歧义,因为冒号
已经用于构造地址。

因此,采用冒号分隔端口号的 IP 地址解析器应该以某种方式区分 IPv6 地址。一种方法是将地址括在括号中,就像使用统一资源定位器 (URL) [RFC2732] 所做的那样;例如,http://[2001:db8::1]:80。

一些应用程序还需要指定 IPv6 前缀和长度:
前缀长度应插入方括号之外(
如果使用);例如,[2001:db8::]/64 或 2001:db8::/64 而不是
[2001:db8::/64]。请注意,前缀/长度表示法在语法上
与合法 URI 没有区别; 因此,如果从上下文中不清楚它用于指定前缀和长度而不是例如 URI
,则不得使用前缀/长度表示法。

在某些特定情况下,可能需要提供区域标识符作为地址的一部分;例如,fe80::1%eth0。通常,应用程序不需要解析这些标识符。

IP 地址解析器应支持将 IPv6 地址括在括号中,即使该地址未与
端口号一起使用。不建议要求用户始终提供用
括号括起来的文字 IP 地址。

请注意,某些应用程序也可能以不同的方式表示 IPv6 地址文字;例如,SMTP [RFC2821] 使用 [IPv6:2001:db8::1]。

请注意,对于
应用程序的通用直接输入,强烈建议不要使用地址文字。应改为使用主机名和 DNS。

这将改变您使用地址的行:

  "Host" : [ "[2a01:c22:cc09:b600:81fb:91fe:4788:d52d]:8889" ],
于 2021-07-23T13:03:33.413 回答