snichol 2003/09/02 08:38:08
Modified: java/src/org/apache/soap/util/net SSLUtils.java Log: Set read timeout before doing handshake, so that handshake cannot hang if the calling code specifies a non-zero timeout. Revision Changes Path 1.13 +22 -18 xml-soap/java/src/org/apache/soap/util/net/SSLUtils.java Index: SSLUtils.java =================================================================== RCS file: /home/cvs/xml-soap/java/src/org/apache/soap/util/net/SSLUtils.java,v retrieving revision 1.12 retrieving revision 1.13 diff -u -r1.12 -r1.13 --- SSLUtils.java 1 Apr 2003 14:07:20 -0000 1.12 +++ SSLUtils.java 2 Sep 2003 15:38:08 -0000 1.13 @@ -199,9 +199,6 @@ sslSocket = (SSLSocket) factory.createSocket(host, port); } } - - if (sslSocket != null && tcpNoDelay != null) - sslSocket.setTcpNoDelay(tcpNoDelay.booleanValue()); } else { /* * If a proxy has been set... @@ -214,22 +211,27 @@ // Overlay tunnel socket with SSL sslSocket = (SSLSocket) factory.createSocket(tunnel, host, port, true); - if (sslSocket != null && tcpNoDelay != null) - sslSocket.setTcpNoDelay(tcpNoDelay.booleanValue()); } - /* - * Handshaking is started manually in this example because - * PrintWriter catches all IOExceptions (including - * SSLExceptions), sets an internal error flag, and then - * returns without rethrowing the exception. - * - * Unfortunately, this means any error messages are lost, - * which caused lots of confusion for others using this - * code. The only way to tell there was an error is to call - * PrintWriter.checkError(). - */ - sslSocket.startHandshake(); + if (sslSocket != null) { + if (tcpNoDelay != null) + sslSocket.setTcpNoDelay(tcpNoDelay.booleanValue()); + if (timeout > 0) // Should be redundant but not every JVM likes this + sslSocket.setSoTimeout(timeout); + + /* + * Handshaking is started manually in this example because + * PrintWriter catches all IOExceptions (including + * SSLExceptions), sets an internal error flag, and then + * returns without rethrowing the exception. + * + * Unfortunately, this means any error messages are lost, + * which caused lots of confusion for others using this + * code. The only way to tell there was an error is to call + * PrintWriter.checkError(). + */ + sslSocket.startHandshake(); + } return (Socket) sslSocket; } @@ -241,8 +243,10 @@ throws IOException, InvocationTargetException { Socket tunnel = SocketUtils.createSocket(tunnelHost, tunnelPort, timeout); - if (tunnel != null && tcpNoDelay != null) + if (tcpNoDelay != null) tunnel.setTcpNoDelay(tcpNoDelay.booleanValue()); + if (timeout > 0) // Should be redundant but not every JVM likes this + tunnel.setSoTimeout(timeout); String msg; OutputStream out = tunnel.getOutputStream();