001package lucee.runtime.net.http.sni;
002
003import java.io.IOException;
004import java.net.Socket;
005
006import javax.net.ssl.HostnameVerifier;
007import javax.net.ssl.SSLContext;
008
009import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
010import org.apache.http.protocol.HttpContext;
011
012public class SSLConnectionSocketFactoryImpl extends SSLConnectionSocketFactory {
013
014    public static final String ENABLE_SNI = "*.disable.sni";
015
016    /*
017     * Implement any constructor you need for your particular application -
018     * SSLConnectionSocketFactory has many variants
019     */
020    public SSLConnectionSocketFactoryImpl(final SSLContext sslContext, final HostnameVerifier verifier) {
021        super(sslContext, verifier);
022    }
023    public SSLConnectionSocketFactoryImpl(final SSLContext sslContext) {
024        super(sslContext);
025    }
026
027    @Override
028    public Socket createLayeredSocket(
029            final Socket socket,
030            final String target,
031            final int port,
032            final HttpContext context) throws IOException {
033        Boolean enableSniValue = (Boolean) context.getAttribute(ENABLE_SNI);
034        boolean enableSni = enableSniValue == null || enableSniValue;
035        return super.createLayeredSocket(socket, enableSni ? target : ENABLE_SNI, port, context);
036    }
037}