001: /*
002: * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//httpclient/src/java/org/apache/commons/httpclient/protocol/SSLProtocolSocketFactory.java,v 1.10 2004/05/13 04:01:22 mbecke Exp $
003: * $Revision: 480424 $
004: * $Date: 2006-11-29 06:56:49 +0100 (Wed, 29 Nov 2006) $
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:
031: package org.apache.commons.httpclient.protocol;
032:
033: import java.io.IOException;
034: import java.net.InetAddress;
035: import java.net.Socket;
036: import java.net.UnknownHostException;
037:
038: import javax.net.ssl.SSLSocketFactory;
039:
040: import org.apache.commons.httpclient.ConnectTimeoutException;
041: import org.apache.commons.httpclient.params.HttpConnectionParams;
042:
043: /**
044: * A SecureProtocolSocketFactory that uses JSSE to create sockets.
045: *
046: * @author Michael Becke
047: * @author <a href="mailto:mbowler@GargoyleSoftware.com">Mike Bowler</a>
048: *
049: * @since 2.0
050: */
051: public class SSLProtocolSocketFactory implements
052: SecureProtocolSocketFactory {
053:
054: /**
055: * The factory singleton.
056: */
057: private static final SSLProtocolSocketFactory factory = new SSLProtocolSocketFactory();
058:
059: /**
060: * Gets an singleton instance of the SSLProtocolSocketFactory.
061: * @return a SSLProtocolSocketFactory
062: */
063: static SSLProtocolSocketFactory getSocketFactory() {
064: return factory;
065: }
066:
067: /**
068: * Constructor for SSLProtocolSocketFactory.
069: */
070: public SSLProtocolSocketFactory() {
071: super ();
072: }
073:
074: /**
075: * @see SecureProtocolSocketFactory#createSocket(java.lang.String,int,java.net.InetAddress,int)
076: */
077: public Socket createSocket(String host, int port,
078: InetAddress clientHost, int clientPort) throws IOException,
079: UnknownHostException {
080: return SSLSocketFactory.getDefault().createSocket(host, port,
081: clientHost, clientPort);
082: }
083:
084: /**
085: * Attempts to get a new socket connection to the given host within the given time limit.
086: * <p>
087: * This method employs several techniques to circumvent the limitations of older JREs that
088: * do not support connect timeout. When running in JRE 1.4 or above reflection is used to
089: * call Socket#connect(SocketAddress endpoint, int timeout) method. When executing in older
090: * JREs a controller thread is executed. The controller thread attempts to create a new socket
091: * within the given limit of time. If socket constructor does not return until the timeout
092: * expires, the controller terminates and throws an {@link ConnectTimeoutException}
093: * </p>
094: *
095: * @param host the host name/IP
096: * @param port the port on the host
097: * @param localAddress the local host name/IP to bind the socket to
098: * @param localPort the port on the local machine
099: * @param params {@link HttpConnectionParams Http connection parameters}
100: *
101: * @return Socket a new socket
102: *
103: * @throws IOException if an I/O error occurs while creating the socket
104: * @throws UnknownHostException if the IP address of the host cannot be
105: * determined
106: *
107: * @since 3.0
108: */
109: public Socket createSocket(final String host, final int port,
110: final InetAddress localAddress, final int localPort,
111: final HttpConnectionParams params) throws IOException,
112: UnknownHostException, ConnectTimeoutException {
113: if (params == null) {
114: throw new IllegalArgumentException(
115: "Parameters may not be null");
116: }
117: int timeout = params.getConnectionTimeout();
118: if (timeout == 0) {
119: return createSocket(host, port, localAddress, localPort);
120: } else {
121: // To be eventually deprecated when migrated to Java 1.4 or above
122: Socket socket = ReflectionSocketFactory.createSocket(
123: "javax.net.ssl.SSLSocketFactory", host, port,
124: localAddress, localPort, timeout);
125: if (socket == null) {
126: socket = ControllerThreadSocketFactory.createSocket(
127: this , host, port, localAddress, localPort,
128: timeout);
129: }
130: return socket;
131: }
132: }
133:
134: /**
135: * @see SecureProtocolSocketFactory#createSocket(java.lang.String,int)
136: */
137: public Socket createSocket(String host, int port)
138: throws IOException, UnknownHostException {
139: return SSLSocketFactory.getDefault().createSocket(host, port);
140: }
141:
142: /**
143: * @see SecureProtocolSocketFactory#createSocket(java.net.Socket,java.lang.String,int,boolean)
144: */
145: public Socket createSocket(Socket socket, String host, int port,
146: boolean autoClose) throws IOException, UnknownHostException {
147: return ((SSLSocketFactory) SSLSocketFactory.getDefault())
148: .createSocket(socket, host, port, autoClose);
149: }
150:
151: /**
152: * All instances of SSLProtocolSocketFactory are the same.
153: */
154: public boolean equals(Object obj) {
155: return ((obj != null) && obj.getClass().equals(getClass()));
156: }
157:
158: /**
159: * All instances of SSLProtocolSocketFactory have the same hash code.
160: */
161: public int hashCode() {
162: return getClass().hashCode();
163: }
164:
165: }
|