1 /* 2 * $HeadURL: http://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk/module-client/src/main/java/org/apache/http/conn/scheme/PlainSocketFactory.java $ 3 * $Revision: 659194 $ 4 * $Date: 2008-05-22 11:33:47 -0700 (Thu, 22 May 2008) $ 5 * 6 * ==================================================================== 7 * Licensed to the Apache Software Foundation (ASF) under one 8 * or more contributor license agreements. See the NOTICE file 9 * distributed with this work for additional information 10 * regarding copyright ownership. The ASF licenses this file 11 * to you under the Apache License, Version 2.0 (the 12 * "License"); you may not use this file except in compliance 13 * with the License. You may obtain a copy of the License at 14 * 15 * http://www.apache.org/licenses/LICENSE-2.0 16 * 17 * Unless required by applicable law or agreed to in writing, 18 * software distributed under the License is distributed on an 19 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 20 * KIND, either express or implied. See the License for the 21 * specific language governing permissions and limitations 22 * under the License. 23 * ==================================================================== 24 * 25 * This software consists of voluntary contributions made by many 26 * individuals on behalf of the Apache Software Foundation. For more 27 * information on the Apache Software Foundation, please see 28 * <http://www.apache.org/>. 29 * 30 */ 31 32 package org.apache.http.conn.scheme; 33 34 import java.io.IOException; 35 import java.net.InetAddress; 36 import java.net.InetSocketAddress; 37 import java.net.Socket; 38 import java.net.SocketTimeoutException; 39 40 import org.apache.http.conn.ConnectTimeoutException; 41 import org.apache.http.params.HttpConnectionParams; 42 import org.apache.http.params.HttpParams; 43 44 /** 45 * The default class for creating sockets. 46 * 47 * @author <a href="mailto:rolandw at apache.org">Roland Weber</a> 48 * @author Michael Becke 49 */ 50 public final class PlainSocketFactory implements SocketFactory { 51 52 /** 53 * The factory singleton. 54 */ 55 private static final 56 PlainSocketFactory DEFAULT_FACTORY = new PlainSocketFactory(); 57 58 private final HostNameResolver nameResolver; 59 60 /** 61 * Gets the singleton instance of this class. 62 * @return the one and only plain socket factory 63 */ 64 public static PlainSocketFactory getSocketFactory() { 65 return DEFAULT_FACTORY; 66 } 67 68 public PlainSocketFactory(final HostNameResolver nameResolver) { 69 super(); 70 this.nameResolver = nameResolver; 71 } 72 73 74 public PlainSocketFactory() { 75 this(null); 76 } 77 78 // non-javadoc, see interface org.apache.http.conn.SocketFactory 79 public Socket createSocket() { 80 return new Socket(); 81 } 82 83 // non-javadoc, see interface org.apache.http.conn.SocketFactory 84 public Socket connectSocket(Socket sock, String host, int port, 85 InetAddress localAddress, int localPort, 86 HttpParams params) 87 throws IOException { 88 89 if (host == null) { 90 throw new IllegalArgumentException("Target host may not be null."); 91 } 92 if (params == null) { 93 throw new IllegalArgumentException("Parameters may not be null."); 94 } 95 96 if (sock == null) 97 sock = createSocket(); 98 99 if ((localAddress != null) || (localPort > 0)) { 100 101 // we need to bind explicitly 102 if (localPort < 0) 103 localPort = 0; // indicates "any" 104 105 InetSocketAddress isa = 106 new InetSocketAddress(localAddress, localPort); 107 sock.bind(isa); 108 } 109 110 int timeout = HttpConnectionParams.getConnectionTimeout(params); 111 112 InetSocketAddress remoteAddress; 113 if (this.nameResolver != null) { 114 remoteAddress = new InetSocketAddress(this.nameResolver.resolve(host), port); 115 } else { 116 remoteAddress = new InetSocketAddress(host, port); 117 } 118 try { 119 sock.connect(remoteAddress, timeout); 120 } catch (SocketTimeoutException ex) { 121 throw new ConnectTimeoutException("Connect to " + remoteAddress + " timed out"); 122 } 123 return sock; 124 125 } // connectSocket 126 127 128 /** 129 * Checks whether a socket connection is secure. 130 * This factory creates plain socket connections 131 * which are not considered secure. 132 * 133 * @param sock the connected socket 134 * 135 * @return <code>false</code> 136 * 137 * @throws IllegalArgumentException if the argument is invalid 138 */ 139 public final boolean isSecure(Socket sock) 140 throws IllegalArgumentException { 141 142 if (sock == null) { 143 throw new IllegalArgumentException("Socket may not be null."); 144 } 145 // This class check assumes that createSocket() calls the constructor 146 // directly. If it was using javax.net.SocketFactory, we couldn't make 147 // an assumption about the socket class here. 148 if (sock.getClass() != Socket.class) { 149 throw new IllegalArgumentException 150 ("Socket not created by this factory."); 151 } 152 // This check is performed last since it calls a method implemented 153 // by the argument object. getClass() is final in java.lang.Object. 154 if (sock.isClosed()) { 155 throw new IllegalArgumentException("Socket is closed."); 156 } 157 158 return false; 159 160 } // isSecure 161 162 163 /** 164 * Compares this factory with an object. 165 * There is only one instance of this class. 166 * 167 * @param obj the object to compare with 168 * 169 * @return iff the argument is this object 170 */ 171 @Override 172 public boolean equals(Object obj) { 173 return (obj == this); 174 } 175 176 /** 177 * Obtains a hash code for this object. 178 * All instances of this class have the same hash code. 179 * There is only one instance of this class. 180 */ 181 @Override 182 public int hashCode() { 183 return PlainSocketFactory.class.hashCode(); 184 } 185 186 } 187