diff options
-rw-r--r-- | java/src/IceInternal/Network.java | 35 | ||||
-rw-r--r-- | java/src/IceSSL/AcceptorI.java | 3 | ||||
-rw-r--r-- | java/src/IceSSL/ConnectorI.java | 2 | ||||
-rw-r--r-- | java/src/IceSSL/Instance.java | 12 | ||||
-rw-r--r-- | java/src/IceSSL/TransceiverI.java | 21 | ||||
-rw-r--r-- | java/test/Ice/binding/AllTests.java | 8 |
6 files changed, 64 insertions, 17 deletions
diff --git a/java/src/IceInternal/Network.java b/java/src/IceInternal/Network.java index 568a6c5d0f4..d2ccaec4f90 100644 --- a/java/src/IceInternal/Network.java +++ b/java/src/IceInternal/Network.java @@ -1103,9 +1103,7 @@ public final class Network { StringBuilder s = new StringBuilder(128); s.append("local address = "); - s.append(localAddr.getHostAddress()); - s.append(':'); - s.append(localPort); + s.append(addrToString(localAddr, localPort)); if(remoteAddr == null) { s.append("\nremote address = <not connected>"); @@ -1113,9 +1111,7 @@ public final class Network else { s.append("\nremote address = "); - s.append(remoteAddr.getHostAddress()); - s.append(':'); - s.append(remotePort); + s.append(addrToString(remoteAddr, remotePort)); } return s.toString(); @@ -1150,6 +1146,33 @@ public final class Network (bytes.length == 4 && protocol == EnableIPv4)); } + private static String + addrToString(java.net.InetAddress addr, int port) + { + StringBuffer s = new StringBuffer(); + + // + // In early Android releases, sockets don't correctly report their address and + // port information. + // + + if(addr == null || addr.isAnyLocalAddress()) + { + s.append("<not available>"); + } + else + { + s.append(addr.getHostAddress()); + } + + if(port > 0) + { + s.append(':'); + s.append(port); + } + + return s.toString(); + } private static java.net.InetSocketAddress getAddressImpl(String host, int port, int protocol, boolean server) diff --git a/java/src/IceSSL/AcceptorI.java b/java/src/IceSSL/AcceptorI.java index 563878e159e..ff3f1521bde 100644 --- a/java/src/IceSSL/AcceptorI.java +++ b/java/src/IceSSL/AcceptorI.java @@ -74,7 +74,8 @@ final class AcceptorI implements IceInternal.Acceptor IceInternal.Network.setBlock(fd, false); IceInternal.Network.setTcpBufSize(fd, _instance.communicator().getProperties(), _logger); - engine = _instance.createSSLEngine(true); + java.net.InetSocketAddress peerAddr = (java.net.InetSocketAddress)fd.socket().getRemoteSocketAddress(); + engine = _instance.createSSLEngine(true, peerAddr); } catch(RuntimeException ex) { diff --git a/java/src/IceSSL/ConnectorI.java b/java/src/IceSSL/ConnectorI.java index 7bc0fa39d69..544a25c0d9b 100644 --- a/java/src/IceSSL/ConnectorI.java +++ b/java/src/IceSSL/ConnectorI.java @@ -38,7 +38,7 @@ final class ConnectorI implements IceInternal.Connector boolean connected = IceInternal.Network.doConnect(fd, _addr); try { - javax.net.ssl.SSLEngine engine = _instance.createSSLEngine(false); + javax.net.ssl.SSLEngine engine = _instance.createSSLEngine(false, _addr); return new TransceiverI(_instance, engine, fd, _host, connected, false, ""); } catch(RuntimeException ex) diff --git a/java/src/IceSSL/Instance.java b/java/src/IceSSL/Instance.java index 633e3530e31..25dc8da8486 100644 --- a/java/src/IceSSL/Instance.java +++ b/java/src/IceSSL/Instance.java @@ -704,9 +704,17 @@ class Instance } javax.net.ssl.SSLEngine - createSSLEngine(boolean incoming) + createSSLEngine(boolean incoming, java.net.InetSocketAddress peerAddr) { - javax.net.ssl.SSLEngine engine = _context.createSSLEngine(); + javax.net.ssl.SSLEngine engine; + if(peerAddr != null) + { + engine = _context.createSSLEngine(peerAddr.getHostName(), peerAddr.getPort()); + } + else + { + engine = _context.createSSLEngine(); + } engine.setUseClientMode(!incoming); String[] cipherSuites = filterCiphers(engine.getSupportedCipherSuites(), engine.getEnabledCipherSuites()); diff --git a/java/src/IceSSL/TransceiverI.java b/java/src/IceSSL/TransceiverI.java index b84f4397921..c7efdbbf4f0 100644 --- a/java/src/IceSSL/TransceiverI.java +++ b/java/src/IceSSL/TransceiverI.java @@ -351,8 +351,21 @@ final class TransceiverI implements IceInternal.Transceiver NativeConnectionInfo info = new NativeConnectionInfo(); java.net.Socket socket = _fd.socket(); - info.localAddress = socket.getLocalAddress().getHostAddress(); - info.localPort = socket.getLocalPort(); + if(socket.getLocalAddress() != null) + { + info.localAddress = socket.getLocalAddress().getHostAddress(); + info.localPort = socket.getLocalPort(); + } + else + { + // + // On some platforms (e.g., early Android releases), sockets don't + // correctly return address information. + // + info.localAddress = ""; + info.localPort = -1; + } + if(socket.getInetAddress() != null) { info.remoteAddress = socket.getInetAddress().getHostAddress(); @@ -402,6 +415,7 @@ final class TransceiverI implements IceInternal.Transceiver switch(status) { case FINISHED: + case NOT_HANDSHAKING: handshakeCompleted(); break; case NEED_TASK: @@ -470,9 +484,6 @@ final class TransceiverI implements IceInternal.Transceiver status = result.getHandshakeStatus(); break; } - case NOT_HANDSHAKING: - assert(false); - break; } if(result != null) diff --git a/java/test/Ice/binding/AllTests.java b/java/test/Ice/binding/AllTests.java index adbf41466b7..e1f0315302c 100644 --- a/java/test/Ice/binding/AllTests.java +++ b/java/test/Ice/binding/AllTests.java @@ -241,8 +241,12 @@ public class AllTests adapters[3] = com.createObjectAdapter("AdapterRandom14", "default"); adapters[4] = com.createObjectAdapter("AdapterRandom15", "default"); + boolean shortenTest = + System.getProperty("os.name").startsWith("Windows") || + System.getProperty("java.vendor").toLowerCase().indexOf("android") >= 0; + int count; - if(System.getProperty("os.name").startsWith("Windows")) + if(shortenTest) { count = 60; } @@ -255,7 +259,7 @@ public class AllTests while(--count > 0) { TestIntfPrx[] proxies; - if(System.getProperty("os.name").startsWith("Windows")) + if(shortenTest) { if(count == 10) { |