You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2016/12/13 16:48:40 UTC

svn commit: r1774052 - in /tomcat/trunk: java/org/apache/tomcat/util/net/AbstractEndpoint.java webapps/docs/changelog.xml

Author: markt
Date: Tue Dec 13 16:48:40 2016
New Revision: 1774052

URL: http://svn.apache.org/viewvc?rev=1774052&view=rev
Log:
Fix unlock delay on OSX if airdrop is enabled.

Modified:
    tomcat/trunk/java/org/apache/tomcat/util/net/AbstractEndpoint.java
    tomcat/trunk/webapps/docs/changelog.xml

Modified: tomcat/trunk/java/org/apache/tomcat/util/net/AbstractEndpoint.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/AbstractEndpoint.java?rev=1774052&r1=1774051&r2=1774052&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/AbstractEndpoint.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/AbstractEndpoint.java Tue Dec 13 16:48:40 2016
@@ -21,6 +21,7 @@ import java.io.OutputStreamWriter;
 import java.net.InetAddress;
 import java.net.InetSocketAddress;
 import java.net.NetworkInterface;
+import java.net.SocketException;
 import java.util.ArrayList;
 import java.util.Enumeration;
 import java.util.HashMap;
@@ -785,24 +786,7 @@ public abstract class AbstractEndpoint<S
         }
 
         try {
-            if (localAddress.getAddress().isAnyLocalAddress()) {
-                // Need a local address of the same type (IPv4 or IPV6) as the
-                // configured bind address since the connector may be configured
-                // to not map between types.
-                Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
-                while (unlockAddress == null && networkInterfaces.hasMoreElements()) {
-                    NetworkInterface networkInterface = networkInterfaces.nextElement();
-                    Enumeration<InetAddress> inetAddresses = networkInterface.getInetAddresses();
-                    while (unlockAddress == null && inetAddresses.hasMoreElements()) {
-                        InetAddress inetAddress = inetAddresses.nextElement();
-                        if (localAddress.getAddress().getClass().isAssignableFrom(inetAddress.getClass())) {
-                            unlockAddress = new InetSocketAddress(inetAddress, localAddress.getPort());
-                        }
-                    }
-                }
-            } else {
-                unlockAddress = localAddress;
-            }
+            unlockAddress = getUnlockAddress(localAddress);
 
             try (java.net.Socket s = new java.net.Socket()) {
                 int stmo = 2 * 1000;
@@ -851,6 +835,52 @@ public abstract class AbstractEndpoint<S
         }
     }
 
+
+    private static InetSocketAddress getUnlockAddress(InetSocketAddress localAddress) throws SocketException {
+        if (localAddress.getAddress().isAnyLocalAddress()) {
+            // Need a local address of the same type (IPv4 or IPV6) as the
+            // configured bind address since the connector may be configured
+            // to not map between types.
+            InetAddress loopbackUnlockAddress = null;
+            InetAddress linkLocalUnlockAddress = null;
+
+            Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
+            while (networkInterfaces.hasMoreElements()) {
+                NetworkInterface networkInterface = networkInterfaces.nextElement();
+                Enumeration<InetAddress> inetAddresses = networkInterface.getInetAddresses();
+                while (inetAddresses.hasMoreElements()) {
+                    InetAddress inetAddress = inetAddresses.nextElement();
+                    if (localAddress.getAddress().getClass().isAssignableFrom(inetAddress.getClass())) {
+                        if (inetAddress.isLoopbackAddress()) {
+                            if (loopbackUnlockAddress == null) {
+                                loopbackUnlockAddress = inetAddress;
+                            }
+                        } else if (inetAddress.isLinkLocalAddress()) {
+                            if (linkLocalUnlockAddress == null) {
+                                linkLocalUnlockAddress = inetAddress;
+                            }
+                        } else {
+                            // Use a non-link local, non-loop back address by default
+                            return new InetSocketAddress(inetAddress, localAddress.getPort());
+                        }
+                    }
+                }
+            }
+            // Prefer loop back over link local since on some platforms (e.g.
+            // OSX) some link local addresses are not included when listening on
+            // all local addresses.
+            if (loopbackUnlockAddress != null) {
+                return new InetSocketAddress(loopbackUnlockAddress, localAddress.getPort());
+            }
+            if (linkLocalUnlockAddress != null) {
+                return new InetSocketAddress(linkLocalUnlockAddress, localAddress.getPort());
+            }
+            return null;
+        } else {
+            return localAddress;
+        }
+    }
+
 
     // ---------------------------------------------- Request processing methods
 

Modified: tomcat/trunk/webapps/docs/changelog.xml
URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1774052&r1=1774051&r2=1774052&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/trunk/webapps/docs/changelog.xml Tue Dec 13 16:48:40 2016
@@ -81,6 +81,12 @@
         with a clear error message HTTP/2 header values that contain characters
         with unicode code points above 255. (markt)
       </fix>
+      <fix>
+        Improve the logic that selects an address to use to unlock the Acceptor
+        to take account of platforms what do not listen on all local addresses
+        when configured with an address of <code>0.0.0.0</code> or
+        <code>::</code>. (markt)
+      </fix>
     </changelog>
   </subsection>
   <subsection name="Web Applications">



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org