001/* 002 * ==================================================================== 003 * Licensed to the Apache Software Foundation (ASF) under one 004 * or more contributor license agreements. See the NOTICE file 005 * distributed with this work for additional information 006 * regarding copyright ownership. The ASF licenses this file 007 * to you under the Apache License, Version 2.0 (the 008 * "License"); you may not use this file except in compliance 009 * with the License. You may obtain a copy of the License at 010 * 011 * http://www.apache.org/licenses/LICENSE-2.0 012 * 013 * Unless required by applicable law or agreed to in writing, 014 * software distributed under the License is distributed on an 015 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 016 * KIND, either express or implied. See the License for the 017 * specific language governing permissions and limitations 018 * under the License. 019 * ==================================================================== 020 * 021 * This software consists of voluntary contributions made by many 022 * individuals on behalf of the Apache Software Foundation. For more 023 * information on the Apache Software Foundation, please see 024 * <http://www.apache.org/>. 025 * 026 */ 027 028package org.apache.http.conn.socket; 029 030import java.io.IOException; 031import java.net.InetSocketAddress; 032import java.net.Socket; 033 034import org.apache.http.HttpHost; 035import org.apache.http.annotation.Contract; 036import org.apache.http.annotation.ThreadingBehavior; 037import org.apache.http.protocol.HttpContext; 038 039/** 040 * The default class for creating plain (unencrypted) sockets. 041 * 042 * @since 4.3 043 */ 044@Contract(threading = ThreadingBehavior.IMMUTABLE) 045public class PlainConnectionSocketFactory implements ConnectionSocketFactory { 046 047 public static final PlainConnectionSocketFactory INSTANCE = new PlainConnectionSocketFactory(); 048 049 public static PlainConnectionSocketFactory getSocketFactory() { 050 return INSTANCE; 051 } 052 053 public PlainConnectionSocketFactory() { 054 super(); 055 } 056 057 @Override 058 public Socket createSocket(final HttpContext context) throws IOException { 059 return new Socket(); 060 } 061 062 @Override 063 public Socket connectSocket( 064 final int connectTimeout, 065 final Socket socket, 066 final HttpHost host, 067 final InetSocketAddress remoteAddress, 068 final InetSocketAddress localAddress, 069 final HttpContext context) throws IOException { 070 final Socket sock = socket != null ? socket : createSocket(context); 071 if (localAddress != null) { 072 sock.bind(localAddress); 073 } 074 try { 075 sock.connect(remoteAddress, connectTimeout); 076 } catch (final IOException ex) { 077 try { 078 sock.close(); 079 } catch (final IOException ignore) { 080 } 081 throw ex; 082 } 083 return sock; 084 } 085 086}