package com.koushikdutta.async.http; import java.lang.reflect.Field; import java.util.Hashtable; import javax.net.ssl.SSLEngine; /** * Created by koush on 12/8/14. */ public class SSLEngineSNIConfigurator implements AsyncSSLEngineConfigurator { private static class EngineHolder implements AsyncSSLEngineConfigurator { Field peerHost; Field peerPort; Field sslParameters; Field useSni; public EngineHolder(Class engineClass) { try { peerHost = engineClass.getSuperclass().getDeclaredField("peerHost"); peerHost.setAccessible(true); peerPort = engineClass.getSuperclass().getDeclaredField("peerPort"); peerPort.setAccessible(true); sslParameters = engineClass.getDeclaredField("sslParameters"); sslParameters.setAccessible(true); useSni = sslParameters.getType().getDeclaredField("useSni"); useSni.setAccessible(true); } catch (NoSuchFieldException e) { } } @Override public void configureEngine(SSLEngine engine, AsyncHttpClientMiddleware.GetSocketData data, String host, int port) { if (useSni == null) return; try { peerHost.set(engine, host); peerPort.set(engine, port); Object sslp = sslParameters.get(engine); useSni.set(sslp, true); } catch (IllegalAccessException e) { } } } Hashtable<String, EngineHolder> holders = new Hashtable<String, EngineHolder>(); @Override public void configureEngine(SSLEngine engine, AsyncHttpClientMiddleware.GetSocketData data, String host, int port) { String name = engine.getClass().getCanonicalName(); EngineHolder holder = holders.get(name); if (holder == null) { holder = new EngineHolder(engine.getClass()); holders.put(name, holder); } holder.configureEngine(engine, data, host, port); } }