This is an automated email from the ASF dual-hosted git repository.
zrlw pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/dubbo-hessian-lite.git
The following commit(s) were added to refs/heads/master by this push:
new 221cd560 Enhance Inet6Address deserialization to support
NetworkInterface (#96)
221cd560 is described below
commit 221cd560e2cdfdb3ad1436c97dda1209606db3eb
Author: wuwen <[email protected]>
AuthorDate: Sat Sep 20 09:42:29 2025 +0800
Enhance Inet6Address deserialization to support NetworkInterface (#96)
---
.../io/socket/Inet6AddressDeserializer.java | 11 ++++++--
.../io/socket/Inet6AddressHolderDeserializer.java | 17 ++++++++++--
.../caucho/hessian/io/socket/InetAddressTest.java | 30 ++++++++++++++++++++++
3 files changed, 54 insertions(+), 4 deletions(-)
diff --git
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/socket/Inet6AddressDeserializer.java
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/socket/Inet6AddressDeserializer.java
index a861bdc4..791ae835 100644
---
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/socket/Inet6AddressDeserializer.java
+++
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/socket/Inet6AddressDeserializer.java
@@ -23,6 +23,7 @@ import com.alibaba.com.caucho.hessian.io.IOExceptionWrapper;
import java.io.IOException;
import java.net.Inet6Address;
import java.net.InetAddress;
+import java.net.NetworkInterface;
public class Inet6AddressDeserializer extends AbstractDeserializer {
public Class<?> getType() {
@@ -61,8 +62,14 @@ public class Inet6AddressDeserializer extends
AbstractDeserializer {
}
}
if (inet4Address != null) {
- inet6Address =
Inet6Address.getByAddress(inet4Address.getHostName(), inet6Address.getAddress(),
- inet6Address.getScopeId() <= 0 ? -1 :
inet6Address.getScopeId());
+ NetworkInterface scopedInterface =
inet6Address.getScopedInterface();
+ if (scopedInterface != null) {
+ inet6Address =
Inet6Address.getByAddress(inet4Address.getHostName(), inet6Address.getAddress(),
+ scopedInterface);
+ } else {
+ inet6Address =
Inet6Address.getByAddress(inet4Address.getHostName(), inet6Address.getAddress(),
+ inet6Address.getScopeId() <= 0 ? -1 :
inet6Address.getScopeId());
+ }
}
in.addRef(inet6Address);
diff --git
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/socket/Inet6AddressHolderDeserializer.java
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/socket/Inet6AddressHolderDeserializer.java
index 2f26d922..67885a2a 100644
---
a/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/socket/Inet6AddressHolderDeserializer.java
+++
b/hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/socket/Inet6AddressHolderDeserializer.java
@@ -23,6 +23,7 @@ import com.alibaba.com.caucho.hessian.io.IOExceptionWrapper;
import java.io.IOException;
import java.net.Inet6Address;
import java.net.InetAddress;
+import java.net.NetworkInterface;
public class Inet6AddressHolderDeserializer extends AbstractDeserializer {
@Override
@@ -47,18 +48,30 @@ public class Inet6AddressHolderDeserializer extends
AbstractDeserializer {
try {
byte[] ipaddress = new byte[16];
int scope_id = 0;
+ String ifname = null;
for (String fieldName : fieldNames) {
if ("ipaddress".equals(fieldName)) {
ipaddress = (byte[]) in.readObject();
} else if ("scope_id".equals(fieldName)) {
scope_id = in.readInt();
+ } else if ("scope_ifname".equals(fieldName)) {
+ ifname = in.readString();
} else {
in.readObject();
}
}
-
- InetAddress obj = Inet6Address.getByAddress("", ipaddress,
scope_id <= 0 ? -1 : scope_id);
+ InetAddress obj = null;
+ if (ifname != null) {
+ NetworkInterface scopeIfname =
NetworkInterface.getByName(ifname);
+ if (scopeIfname != null) {
+ obj = Inet6Address.getByAddress("", ipaddress,
scopeIfname);
+ }
+ }
+
+ if (obj == null) {
+ obj = Inet6Address.getByAddress("", ipaddress, scope_id <= 0 ?
-1 : scope_id);
+ }
in.addRef(obj);
diff --git
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/socket/InetAddressTest.java
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/socket/InetAddressTest.java
index d3bafbf3..1cde1f07 100644
---
a/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/socket/InetAddressTest.java
+++
b/java-8-test/src/test/java/com/alibaba/com/caucho/hessian/io/socket/InetAddressTest.java
@@ -25,6 +25,10 @@ import org.junit.jupiter.api.condition.JRE;
import java.net.Inet4Address;
import java.net.Inet6Address;
import java.net.InetAddress;
+import java.net.NetworkInterface;
+import java.net.SocketException;
+import java.util.Collections;
+import java.util.Optional;
public class InetAddressTest extends SerializeTestBase {
@Test
@@ -68,6 +72,32 @@ public class InetAddressTest extends SerializeTestBase {
Assertions.assertEquals(hessian3ToHessian3(inet6Address),
hessian4ToHessian3(inet6Address));
}
+ @Test
+ void testGetByAddressWithNetworkInterface() throws Exception {
+ Optional<NetworkInterface> optNif =
Collections.list(NetworkInterface.getNetworkInterfaces()).stream()
+ .filter(t -> {
+ try {
+ return t.isUp();
+ } catch (SocketException e) {
+ throw new RuntimeException(e);
+ }
+ })
+ .filter(nif ->
+
Collections.list(nif.getInetAddresses()).stream().anyMatch(Inet6Address.class::isInstance))
+ .findFirst();
+
+ if (optNif.isPresent()) {
+ NetworkInterface nif = optNif.get();
+ Inet6Address inet6Address = Inet6Address.getByAddress(
+ "baidu.com", InetAddress.getByName("::1").getAddress(),
nif);
+ Inet6Address result = baseHessian2Serialize(inet6Address);
+ Assertions.assertEquals(inet6Address, result);
+ Assertions.assertEquals(inet6Address.getHostAddress(),
result.getHostAddress());
+ Assertions.assertEquals(inet6Address.getHostName(),
result.getHostName());
+ Assertions.assertArrayEquals(inet6Address.getAddress(),
result.getAddress());
+ }
+ }
+
@Test
@EnabledForJreRange(min = JRE.JAVA_17)
void testJdk17() throws Exception {