001package lucee.runtime.net.http.sni;
002
003import java.io.IOException;
004import java.net.InetSocketAddress;
005
006import javax.net.ssl.SSLProtocolException;
007
008import org.apache.http.HttpHost;
009import org.apache.http.config.SocketConfig;
010import org.apache.http.conn.ManagedHttpClientConnection;
011import org.apache.http.conn.socket.ConnectionSocketFactory;
012import org.apache.http.impl.conn.DefaultHttpClientConnectionOperator;
013import org.apache.http.protocol.HttpContext;
014import org.apache.http.config.Lookup;
015
016public class DefaultHttpClientConnectionOperatorImpl extends DefaultHttpClientConnectionOperator {
017
018    public DefaultHttpClientConnectionOperatorImpl(Lookup<ConnectionSocketFactory> socketFactoryRegistry) {
019        super(socketFactoryRegistry, null, null);
020    }
021
022    @Override
023    public void connect(
024            final ManagedHttpClientConnection conn,
025            final HttpHost host,
026            final InetSocketAddress localAddress,
027            final int connectTimeout,
028            final SocketConfig socketConfig,
029            final HttpContext context) throws IOException {
030        try {
031                super.connect(conn, host, localAddress, connectTimeout, socketConfig, context);
032        }
033        catch (SSLProtocolException e) {
034                Boolean enableSniValue = (Boolean) context.getAttribute(SSLConnectionSocketFactoryImpl.ENABLE_SNI);
035            boolean enableSni = enableSniValue == null || enableSniValue;
036            if (enableSni && e.getMessage() != null && e.getMessage().equals("handshake alert:  unrecognized_name")) {
037                //print.e("Server received saw wrong SNI host, retrying without SNI");
038                context.setAttribute(SSLConnectionSocketFactoryImpl.ENABLE_SNI, false);
039                super.connect(conn, host, localAddress, connectTimeout, socketConfig, context);
040            } 
041            else throw e;
042        }
043    }
044}