001: /*
002: * $Header$
003: * $Revision: 530846 $
004: * $Date: 2007-04-20 18:18:16 +0200 (Fri, 20 Apr 2007) $
005: *
006: * ====================================================================
007: *
008: * Licensed to the Apache Software Foundation (ASF) under one or more
009: * contributor license agreements. See the NOTICE file distributed with
010: * this work for additional information regarding copyright ownership.
011: * The ASF licenses this file to You under the Apache License, Version 2.0
012: * (the "License"); you may not use this file except in compliance with
013: * the License. You may obtain a copy of the License at
014: *
015: * http://www.apache.org/licenses/LICENSE-2.0
016: *
017: * Unless required by applicable law or agreed to in writing, software
018: * distributed under the License is distributed on an "AS IS" BASIS,
019: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
020: * See the License for the specific language governing permissions and
021: * limitations under the License.
022: * ====================================================================
023: *
024: * This software consists of voluntary contributions made by many
025: * individuals on behalf of the Apache Software Foundation. For more
026: * information on the Apache Software Foundation, please see
027: * <http://www.apache.org/>.
028: *
029: */
030: package org.apache.commons.httpclient.contrib.ssl;
031:
032: import java.io.IOException;
033: import java.net.InetAddress;
034: import java.net.InetSocketAddress;
035: import java.net.Socket;
036: import java.net.SocketAddress;
037: import java.net.UnknownHostException;
038: import javax.net.ssl.SSLSocketFactory;
039: import org.apache.commons.httpclient.ConnectTimeoutException;
040: import org.apache.commons.httpclient.params.HttpConnectionParams;
041: import org.apache.commons.httpclient.protocol.SecureProtocolSocketFactory;
042:
043: /**
044: * Author: Mark Claassen
045: * <p>
046: * Uses some code from EasySSLProtocolSocketFactory.java
047: *
048: * <p>
049: * Wraps a SSLSocketFactory with a SecureProtocolSocketFactory.
050: * <p>
051: * This was designed to make HttpClient work in situations where an application is being deployed by
052: * Java Web Start. In these cases, SSL connections are negotiated by webstart implementations of the
053: * KeyManager and TrustManager. Wrapping the socket factory obtained from
054: * HttpsURLConnection.getDefaultSocketFactory allows the use of HttpClient while still leveraging
055: * Java Web Start's handling of SSL certificates
056: */
057: public class SocketFactoryWrapper implements
058: SecureProtocolSocketFactory {
059:
060: private SSLSocketFactory socketFactory;
061:
062: public SocketFactoryWrapper(SSLSocketFactory socketFactory) {
063: this .socketFactory = socketFactory;
064: }
065:
066: public Socket createSocket(String host, int port)
067: throws IOException, UnknownHostException {
068: return socketFactory.createSocket(host, port);
069: }
070:
071: public Socket createSocket(String host, int port,
072: InetAddress localAddress, int localPort)
073: throws IOException, UnknownHostException {
074: return socketFactory.createSocket(host, port, localAddress,
075: localPort);
076: }
077:
078: public Socket createSocket(String host, int port,
079: InetAddress localAddress, int localPort,
080: HttpConnectionParams params) throws IOException,
081: UnknownHostException, ConnectTimeoutException {
082: // Based on code from EasySSLProtocolSocketFactory.java
083: Socket rval;
084: if (params == null) {
085: throw new IllegalArgumentException(
086: "Parameters may not be null");
087: }
088: int timeout = params.getConnectionTimeout();
089: if (timeout == 0) {
090: rval = socketFactory.createSocket(host, port, localAddress,
091: localPort);
092: } else {
093: rval = socketFactory.createSocket();
094: SocketAddress localaddr = new InetSocketAddress(
095: localAddress, localPort);
096: SocketAddress remoteaddr = new InetSocketAddress(host, port);
097: rval.bind(localaddr);
098: rval.connect(remoteaddr, timeout);
099: }
100: return rval;
101: }
102:
103: public Socket createSocket(Socket socket, String host, int port,
104: boolean autoClose) throws IOException, UnknownHostException {
105: return socketFactory
106: .createSocket(socket, host, port, autoClose);
107: }
108:
109: }
|