olegk 2004/12/11 14:35:26 Modified: httpclient/src/test/org/apache/commons/httpclient TestProxy.java httpclient/src/test/org/apache/commons/httpclient/server ProxyRequestHandler.java SimpleHttpServer.java SimpleHttpServerConnection.java SimpleProxy.java StreamProxy.java TransparentProxyRequestHandler.java Added: httpclient/src/test/org/apache/commons/httpclient/server SimplePlainSocketFactory.java SimpleSocketFactory.java httpclient/src/test/org/apache/commons/httpclient/ssl SimpleSSLSocketFactory.java SimpleSSLTestProtocolSocketFactory.java simpleserver.keystore Removed: httpclient/src/test/org/apache/commons/httpclient/server BidiStreamProxy.java Log: * SSL support for the SimpleHttpServer and SimpleProxy * SSL tunneling test cases Contributed by Oleg Kalnichevski Revision Changes Path 1.11 +69 -10 jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/TestProxy.java Index: TestProxy.java =================================================================== RCS file: /home/cvs/jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/TestProxy.java,v retrieving revision 1.10 retrieving revision 1.11 diff -u -r1.10 -r1.11 --- TestProxy.java 28 Nov 2004 15:44:39 -0000 1.10 +++ TestProxy.java 11 Dec 2004 22:35:26 -0000 1.11 @@ -27,6 +27,8 @@ */ package org.apache.commons.httpclient; +import java.util.Enumeration; + import org.apache.commons.httpclient.auth.AuthScheme; import org.apache.commons.httpclient.auth.AuthScope; import org.apache.commons.httpclient.auth.CredentialsNotAvailableException; @@ -35,12 +37,18 @@ import org.apache.commons.httpclient.methods.PostMethod; import org.apache.commons.httpclient.methods.StringRequestEntity; import org.apache.commons.httpclient.protocol.Protocol; +import org.apache.commons.httpclient.protocol.ProtocolSocketFactory; import org.apache.commons.httpclient.server.AuthRequestHandler; import org.apache.commons.httpclient.server.HttpRequestHandlerChain; import org.apache.commons.httpclient.server.HttpServiceHandler; import org.apache.commons.httpclient.server.SimpleHttpServer; +import org.apache.commons.httpclient.server.SimplePlainSocketFactory; import org.apache.commons.httpclient.server.SimpleProxy; +import org.apache.commons.httpclient.server.SimpleSocketFactory; +import org.apache.commons.httpclient.ssl.SimpleSSLSocketFactory; +import org.apache.commons.httpclient.ssl.SimpleSSLTestProtocolSocketFactory; +import junit.extensions.TestSetup; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; @@ -56,27 +64,70 @@ private SimpleProxy proxy = null; private SimpleHttpServer httpserver = null; private HttpClient httpclient = null; + private boolean usessl = false; public TestProxy(String testName) { super(testName); } + static class SSLDecorator extends TestSetup { + + public static void addTests(TestSuite suite) { + TestSuite ts2 = new TestSuite(); + addTest(ts2, suite); + suite.addTest(ts2); + } + + private static void addTest(TestSuite suite, Test t) { + if (t instanceof TestProxy) { + suite.addTest(new SSLDecorator((TestProxy) t)); + } else if (t instanceof TestSuite) { + Enumeration en = ((TestSuite) t).tests(); + while (en.hasMoreElements()) { + addTest(suite, (Test) en.nextElement()); + } + } + } + + public SSLDecorator(TestProxy test) { + super(test); + } + + protected void setUp() throws Exception { + TestProxy base = (TestProxy)getTest(); + base.setUseSSL(true); + } + } + public static Test suite() { - return new TestSuite(TestProxy.class); + TestSuite suite = new TestSuite(TestProxy.class); + SSLDecorator.addTests(suite); + return suite; } protected void setUp() throws Exception { super.setUp(); - this.proxy = new SimpleProxy(); - this.httpserver = new SimpleHttpServer(); this.httpclient = new HttpClient(); + this.proxy = new SimpleProxy(); + this.httpclient.getHostConfiguration().setProxy( + this.proxy.getLocalAddress(), + this.proxy.getLocalPort()); + + SimpleSocketFactory serversocketfactory = null; + Protocol testhttp = null; + if (this.usessl) { + serversocketfactory = new SimpleSSLSocketFactory(); + testhttp = new Protocol("https", + (ProtocolSocketFactory)new SimpleSSLTestProtocolSocketFactory(), 443); + } else { + serversocketfactory = new SimplePlainSocketFactory(); + testhttp = Protocol.getProtocol("http"); + } + this.httpserver = new SimpleHttpServer(serversocketfactory, 0); this.httpclient.getHostConfiguration().setHost( this.httpserver.getLocalAddress(), this.httpserver.getLocalPort(), - Protocol.getProtocol("http")); - this.httpclient.getHostConfiguration().setProxy( - this.proxy.getLocalAddress(), - this.proxy.getLocalPort()); + testhttp); } protected void tearDown() throws Exception { @@ -88,6 +139,14 @@ super.tearDown(); } + public void setUseSSL(boolean b) { + this.usessl = b; + } + + public boolean isUseSSL() { + return this.usessl; + } + class GetItWrongThenGetItRight implements CredentialsProvider { private int hostcount = 0; 1.11 +4 -3 jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/server/ProxyRequestHandler.java Index: ProxyRequestHandler.java =================================================================== RCS file: /home/cvs/jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/server/ProxyRequestHandler.java,v retrieving revision 1.10 retrieving revision 1.11 diff -u -r1.10 -r1.11 --- ProxyRequestHandler.java 13 Nov 2004 22:38:27 -0000 1.10 +++ ProxyRequestHandler.java 11 Dec 2004 22:35:26 -0000 1.11 @@ -76,6 +76,7 @@ URI uri = new URI(oldreqline.getUri(), true); SimpleHost host = new SimpleHost(uri.getHost(), uri.getPort()); SimpleHttpServerConnection proxyconn = this.connmanager.openConnection(host); + proxyconn.setSocketTimeout(0); try { 1.15 +25 -11 jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/server/SimpleHttpServer.java Index: SimpleHttpServer.java =================================================================== RCS file: /home/cvs/jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/server/SimpleHttpServer.java,v retrieving revision 1.14 retrieving revision 1.15 diff -u -r1.14 -r1.15 --- SimpleHttpServer.java 13 Nov 2004 12:21:28 -0000 1.14 +++ SimpleHttpServer.java 11 Dec 2004 22:35:26 -0000 1.15 @@ -63,17 +63,22 @@ * @throws IOException if anything goes wrong during initialization */ public SimpleHttpServer() throws IOException { - this(0); + this(null, 0); } /** - * Creates a new HTTP server instance, using the specified TCP port + * Creates a new HTTP server instance, using the specified socket + * factory and the TCP port * * @param port Desired TCP port * @throws IOException if anything goes wrong during initialization */ - public SimpleHttpServer(int port) throws IOException { - listener = new ServerSocket(port); + public SimpleHttpServer(SimpleSocketFactory socketfactory, int port) + throws IOException { + if (socketfactory == null) { + socketfactory = new SimplePlainSocketFactory(); + } + listener = socketfactory.createServerSocket(port); if(LOG.isDebugEnabled()) { LOG.debug("Starting test HTTP server on port " + getLocalPort()); } @@ -83,6 +88,16 @@ t.start(); } + /** + * Creates a new HTTP server instance, using the specified TCP port + * + * @param port Desired TCP port + * @throws IOException if anything goes wrong during initialization + */ + public SimpleHttpServer(int port) throws IOException { + this(null, port); + } + public String getTestname() { return this.testname; } @@ -133,16 +148,15 @@ /** * Stops this HTTP server instance. */ - public void destroy() { + public synchronized void destroy() { if (stopped) { return; } - stopped = true; + this.stopped = true; if(LOG.isDebugEnabled()) { LOG.debug("Stopping test HTTP server on port " + getLocalPort()); } - tg.interrupt(); if (listener != null) { @@ -179,7 +193,7 @@ public void run() { try { - while (!Thread.interrupted()) { + while (!this.stopped && !Thread.interrupted()) { Socket socket = listener.accept(); try { if (this.requestHandler == null) { 1.21 +12 -3 jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/server/SimpleHttpServerConnection.java Index: SimpleHttpServerConnection.java =================================================================== RCS file: /home/cvs/jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/server/SimpleHttpServerConnection.java,v retrieving revision 1.20 retrieving revision 1.21 diff -u -r1.20 -r1.21 --- SimpleHttpServerConnection.java 13 Nov 2004 22:38:27 -0000 1.20 +++ SimpleHttpServerConnection.java 11 Dec 2004 22:35:26 -0000 1.21 @@ -34,6 +34,7 @@ import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.net.Socket; +import java.net.SocketException; import java.util.Iterator; import org.apache.commons.httpclient.ChunkedOutputStream; @@ -232,5 +233,13 @@ outsream.flush(); } + public int getSocketTimeout() throws SocketException { + return this.socket.getSoTimeout(); + } + + public void setSocketTimeout(int timeout) throws SocketException { + this.socket.setSoTimeout(timeout); + } + } 1.8 +4 -4 jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/server/SimpleProxy.java Index: SimpleProxy.java =================================================================== RCS file: /home/cvs/jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/server/SimpleProxy.java,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- SimpleProxy.java 28 Nov 2004 15:44:39 -0000 1.7 +++ SimpleProxy.java 11 Dec 2004 22:35:26 -0000 1.8 @@ -78,8 +78,8 @@ } public void destroy() { - this.connmanager.shutdown(); super.destroy(); + this.connmanager.shutdown(); } } 1.4 +5 -6 jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/server/StreamProxy.java Index: StreamProxy.java =================================================================== RCS file: /home/cvs/jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/server/StreamProxy.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- StreamProxy.java 22 Feb 2004 18:08:52 -0000 1.3 +++ StreamProxy.java 11 Dec 2004 22:35:26 -0000 1.4 @@ -25,8 +25,6 @@ * information on the Apache Software Foundation, please see * <http://www.apache.org/>. * - * [Additional notices, if required by prior licensing conditions] - * */ package org.apache.commons.httpclient.server; @@ -56,6 +54,7 @@ public synchronized void start() { if (state != 0) throw new IllegalStateException("Can not start again."); state = 1; + pumpThread.setDaemon(true); pumpThread.start(); } @@ -89,7 +88,7 @@ private class Pump implements Runnable { public void run() { - byte[] buffer = new byte[10000]; + byte[] buffer = new byte[1024]; try { while (!Thread.interrupted()) { int len; 1.7 +82 -39 jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/server/TransparentProxyRequestHandler.java Index: TransparentProxyRequestHandler.java =================================================================== RCS file: /home/cvs/jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/server/TransparentProxyRequestHandler.java,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- TransparentProxyRequestHandler.java 27 Feb 2004 19:01:34 -0000 1.6 +++ TransparentProxyRequestHandler.java 11 Dec 2004 22:35:26 -0000 1.7 @@ -25,23 +25,19 @@ * information on the Apache Software Foundation, please see * <http://www.apache.org/>. * - * [Additional notices, if required by prior licensing conditions] - * */ package org.apache.commons.httpclient.server; import java.io.IOException; import java.io.InputStream; +import java.io.InterruptedIOException; import java.io.OutputStream; -import java.io.OutputStreamWriter; -import java.io.UnsupportedEncodingException; -import java.io.Writer; import java.net.Socket; import org.apache.commons.httpclient.Header; -import org.apache.commons.httpclient.HttpURL; -import org.apache.commons.httpclient.URI; +import org.apache.commons.httpclient.HttpStatus; +import org.apache.commons.httpclient.HttpVersion; /** * This request handler can handle the CONNECT method. It does nothing for any @@ -60,44 +56,91 @@ final SimpleHttpServerConnection conn, final SimpleRequest request) throws IOException { + RequestLine line = request.getRequestLine(); String method = line.getMethod(); - if (!"CONNECT".equalsIgnoreCase(method)) + if (!"CONNECT".equalsIgnoreCase(method)) { return false; - URI url = new HttpURL(line.getUri()); - handshake(conn, url); + } + Socket targetSocket = null; + try { + targetSocket = connect(line.getUri()); + } catch (IOException e) { + SimpleResponse response = new SimpleResponse(); + response.setStatusLine(HttpVersion.HTTP_1_1, HttpStatus.SC_NOT_FOUND); + response.setHeader(new Header("Server", "test proxy")); + response.setBodyString("Cannot connect to " + line.getUri()); + conn.writeResponse(response); + return true; + } + SimpleResponse response = new SimpleResponse(); + response.setHeader(new Header("Server", "test proxy")); + response.setStatusLine(HttpVersion.HTTP_1_1, HttpStatus.SC_OK, "Connection established"); + conn.writeResponse(response); + + SimpleHttpServerConnection target = new SimpleHttpServerConnection(targetSocket); + pump(conn, target); return true; } - private void handshake(SimpleHttpServerConnection conn, URI url) throws IOException { - Socket targetSocket = new Socket(url.getHost(), url.getPort()); - InputStream sourceIn = conn.getInputStream(); - OutputStream sourceOut = conn.getOutputStream(); - InputStream targetIn = targetSocket.getInputStream(); - OutputStream targetOut = targetSocket.getOutputStream(); - - ResponseWriter out = conn.getWriter(); - out.println("HTTP/1.1 200 Connection established"); - out.flush(); + private void pump(final SimpleHttpServerConnection source, final SimpleHttpServerConnection target) + throws IOException { - BidiStreamProxy bdsp = new BidiStreamProxy(sourceIn, sourceOut, targetIn, targetOut); - bdsp.start(); - try { - bdsp.block(); - } catch (InterruptedException e) { - throw new IOException(e.toString()); - } - } + source.setSocketTimeout(100); + target.setSocketTimeout(100); - private void sendHeaders(Header[] headers, OutputStream os) throws IOException { - Writer out; - try { - out = new OutputStreamWriter(os, "US-ASCII"); - } catch (UnsupportedEncodingException e) { - throw new RuntimeException(e.toString()); + InputStream sourceIn = source.getInputStream(); + OutputStream sourceOut = source.getOutputStream(); + InputStream targetIn = target.getInputStream(); + OutputStream targetOut = target.getOutputStream(); + + byte[] tmp = new byte[1024]; + int l; + for (;;) { + if (!source.isOpen() || !target.isOpen()) { + break; + } + try { + l = sourceIn.read(tmp); + if (l == -1) { + break; + } + targetOut.write(tmp, 0, l); + } catch (InterruptedIOException ignore) { + if (Thread.interrupted()) { + break; + } + } + try { + l = targetIn.read(tmp); + if (l == -1) { + break; + } + sourceOut.write(tmp, 0, l); + } catch (InterruptedIOException ignore) { + if (Thread.interrupted()) { + break; + } + } } - for (int i = 0; i < headers.length; i++) { - out.write(headers[i].toExternalForm()); + } + + private static Socket connect(final String host) throws IOException { + String hostname = null; + int port; + int i = host.indexOf(':'); + if (i != -1) { + hostname = host.substring(0, i); + try { + port = Integer.parseInt(host.substring(i + 1)); + } catch (NumberFormatException ex) { + throw new IOException("Invalid host address: " + host); + } + } else { + hostname = host; + port = 80; } + return new Socket(hostname, port); } + } 1.1 jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/server/SimplePlainSocketFactory.java Index: SimplePlainSocketFactory.java =================================================================== /* * $Header: /home/cvs/jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/server/SimplePlainSocketFactory.java,v 1.1 2004/12/11 22:35:26 olegk Exp $ * $Revision: 1.1 $ * $Date: 2004/12/11 22:35:26 $ * * ==================================================================== * * Copyright 1999-2004 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. * */ package org.apache.commons.httpclient.server; import java.io.IOException; import java.net.ServerSocket; /** * Defines a plain socket factory * * @author Oleg Kalnichevski */ public class SimplePlainSocketFactory implements SimpleSocketFactory { public SimplePlainSocketFactory() { super(); } public ServerSocket createServerSocket(int port) throws IOException { return new ServerSocket(port); } } 1.1 jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/server/SimpleSocketFactory.java Index: SimpleSocketFactory.java =================================================================== /* * $Header: /home/cvs/jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/server/SimpleSocketFactory.java,v 1.1 2004/12/11 22:35:26 olegk Exp $ * $Revision: 1.1 $ * $Date: 2004/12/11 22:35:26 $ * * ==================================================================== * * Copyright 1999-2004 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. * */ package org.apache.commons.httpclient.server; import java.io.IOException; import java.net.ServerSocket; /** * Defines a socket factory interface * * @author Oleg Kalnichevski */ public interface SimpleSocketFactory { ServerSocket createServerSocket(int port) throws IOException; } 1.1 jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/ssl/SimpleSSLSocketFactory.java Index: SimpleSSLSocketFactory.java =================================================================== /* * $Header: /home/cvs/jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/ssl/SimpleSSLSocketFactory.java,v 1.1 2004/12/11 22:35:26 olegk Exp $ * $Revision: 1.1 $ * $Date: 2004/12/11 22:35:26 $ * * ==================================================================== * * Copyright 1999-2004 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. * */ package org.apache.commons.httpclient.ssl; import java.io.IOException; import java.net.ServerSocket; import java.net.URL; import java.security.KeyStore; import javax.net.ServerSocketFactory; import org.apache.commons.httpclient.server.SimpleSocketFactory; import com.sun.net.ssl.KeyManager; import com.sun.net.ssl.KeyManagerFactory; import com.sun.net.ssl.SSLContext; /** * Defines a SSL socket factory * * @author Oleg Kalnichevski */ public class SimpleSSLSocketFactory implements SimpleSocketFactory { private static SSLContext SSLCONTEXT = null; private static SSLContext createSSLContext() { try { ClassLoader cl = SimpleSocketFactory.class.getClassLoader(); URL url = cl.getResource("org/apache/commons/httpclient/ssl/simpleserver.keystore"); KeyStore keystore = KeyStore.getInstance("jks"); keystore.load(url.openStream(), "nopassword".toCharArray()); KeyManagerFactory kmfactory = KeyManagerFactory.getInstance( KeyManagerFactory.getDefaultAlgorithm()); kmfactory.init(keystore, "nopassword".toCharArray()); KeyManager[] keymanagers = kmfactory.getKeyManagers(); SSLContext sslcontext = SSLContext.getInstance("TLS"); sslcontext.init(keymanagers, null, null); return sslcontext; } catch (Exception ex) { // this is not the way a sane exception handling should be done // but for our simple HTTP testing framework this will suffice throw new IllegalStateException(ex.getMessage()); } } private static SSLContext getSSLContext() { if (SSLCONTEXT == null) { SSLCONTEXT = createSSLContext(); } return SSLCONTEXT; } public SimpleSSLSocketFactory() { super(); } public ServerSocket createServerSocket(int port) throws IOException { ServerSocketFactory socketfactory = getSSLContext().getServerSocketFactory(); return socketfactory.createServerSocket(port); } } 1.1 jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/ssl/SimpleSSLTestProtocolSocketFactory.java Index: SimpleSSLTestProtocolSocketFactory.java =================================================================== /* * $Header: /home/cvs/jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/ssl/SimpleSSLTestProtocolSocketFactory.java,v 1.1 2004/12/11 22:35:26 olegk Exp $ * $Revision: 1.1 $ * $Date: 2004/12/11 22:35:26 $ * * ==================================================================== * * Copyright 2002-2004 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. * */ package org.apache.commons.httpclient.ssl; import java.io.IOException; import java.net.InetAddress; import java.net.Socket; import java.net.URL; import java.net.UnknownHostException; import java.security.KeyStore; import org.apache.commons.httpclient.ConnectTimeoutException; import org.apache.commons.httpclient.params.HttpConnectionParams; import org.apache.commons.httpclient.protocol.ControllerThreadSocketFactory; import org.apache.commons.httpclient.protocol.SecureProtocolSocketFactory; import org.apache.commons.httpclient.server.SimpleSocketFactory; import com.sun.net.ssl.SSLContext; import com.sun.net.ssl.TrustManager; import com.sun.net.ssl.TrustManagerFactory; public class SimpleSSLTestProtocolSocketFactory implements SecureProtocolSocketFactory { private static SSLContext SSLCONTEXT = null; private static SSLContext createSSLContext() { try { ClassLoader cl = SimpleSocketFactory.class.getClassLoader(); URL url = cl.getResource("org/apache/commons/httpclient/ssl/simpleserver.keystore"); KeyStore keystore = KeyStore.getInstance("jks"); keystore.load(url.openStream(), "nopassword".toCharArray()); TrustManagerFactory tmfactory = TrustManagerFactory.getInstance( TrustManagerFactory.getDefaultAlgorithm()); tmfactory.init(keystore); TrustManager[] trustmanagers = tmfactory.getTrustManagers(); SSLContext sslcontext = SSLContext.getInstance("TLS"); sslcontext.init(null, trustmanagers, null); return sslcontext; } catch (Exception ex) { // this is not the way a sane exception handling should be done // but for our simple HTTP testing framework this will suffice throw new IllegalStateException(ex.getMessage()); } } private static SSLContext getSSLContext() { if (SSLCONTEXT == null) { SSLCONTEXT = createSSLContext(); } return SSLCONTEXT; } public SimpleSSLTestProtocolSocketFactory() { super(); } public Socket createSocket( final String host, final int port, final InetAddress localAddress, final int localPort, final HttpConnectionParams params ) throws IOException, UnknownHostException, ConnectTimeoutException { if (params == null) { throw new IllegalArgumentException("Parameters may not be null"); } int timeout = params.getConnectionTimeout(); if (timeout == 0) { return createSocket(host, port, localAddress, localPort); } else { // To be eventually deprecated when migrated to Java 1.4 or above return ControllerThreadSocketFactory.createSocket( this, host, port, localAddress, localPort, timeout); } } public Socket createSocket( String host, int port, InetAddress clientHost, int clientPort) throws IOException, UnknownHostException { return getSSLContext().getSocketFactory().createSocket( host, port, clientHost, clientPort ); } public Socket createSocket(String host, int port) throws IOException, UnknownHostException { return getSSLContext().getSocketFactory().createSocket( host, port ); } public Socket createSocket( Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException { return getSSLContext().getSocketFactory().createSocket( socket, host, port, autoClose ); } } 1.1 jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/ssl/simpleserver.keystore <<Binary file>>
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]