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 {

Reply via email to