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}