Hi, Yes I refactored inner class . Regarding class source, As I wrote on bugzilla of sni bug fixed for 3.0, it comes from a patch submitted to httpcomponents jira by the author.
Regards On Sunday, August 14, 2016, Felix Schumacher < felix.schumac...@internetallee.de> wrote: > > > Am 14. August 2016 12:41:14 MESZ, schrieb sebb <seb...@gmail.com > <javascript:;>>: > >On 31 July 2016 at 21:07, <pmoua...@apache.org <javascript:;>> wrote: > >> Author: pmouawad > >> Date: Sun Jul 31 20:07:10 2016 > >> New Revision: 1754681 > >> > >> URL: http://svn.apache.org/viewvc?rev=1754681&view=rev > >> Log: > >> Bug 59902 - Https handshake failure when setting > >httpclient.socket.https.cps property > >> Bugzilla Id: 59902 > >> > >> Added: > >> jmeter/trunk/src/core/org/apache/jmeter/util/HostNameSetter.java > > (with props) > >> Modified: > >> jmeter/trunk/src/core/org/apache/jmeter/util/SlowSSLSocket.java > >> > >jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/ > JMeterClientConnectionOperator.java > >> jmeter/trunk/xdocs/changes.xml > >> > >> Added: > >jmeter/trunk/src/core/org/apache/jmeter/util/HostNameSetter.java > >> URL: > >http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/ > apache/jmeter/util/HostNameSetter.java?rev=1754681&view=auto > >> > >=========================================================== > =================== > >> --- jmeter/trunk/src/core/org/apache/jmeter/util/HostNameSetter.java > >(added) > >> +++ jmeter/trunk/src/core/org/apache/jmeter/util/HostNameSetter.java > >Sun Jul 31 20:07:10 2016 > >> @@ -0,0 +1,84 @@ > >> +package org.apache.jmeter.util; > >> + > >> +import java.lang.ref.WeakReference; > >> +import java.lang.reflect.InvocationTargetException; > >> +import java.lang.reflect.Method; > >> +import java.util.concurrent.atomic.AtomicReference; > >> + > >> +import javax.net.ssl.SSLSocket; > >> + > >> +/** > >> + * Uses the underlying implementation to support Server Name > >Indication (SNI). > >> + * @author Michael Locher <cmb...@gmail.com <javascript:;>> > > > >@author tags in code are deprecated by the ASF; they are only accurate > >at initial commit, and the ASF is about community code development. > > > >Authors can be credited elsewhere, e.g. in changes.xml, but strictly > >speaking the author should be asked to agree to this change, as it > >affects their original contribution. > > > >We should not commit new code with @author entries. > > > >Nor should code be committed without the AL header. > > > >In this case it's not clear where the code originated, as it does not > >appear to be attached to the Bugzilla. > > I thought it was just the extracted inner class, that got removed by this > commit, wasn't it? > > Regards, > Felix > > > > >> + * @see <a > >href="https://issues.apache.org/jira/browse/HTTPCLIENT-1119 > ">HTTPCLIENT-1119</a> > >> + */ > >> +public class HostNameSetter { > >> + > >> + private static final AtomicReference<HostNameSetter> CURRENT = > >new AtomicReference<>(); > >> + > >> + private final WeakReference<Class<?>> cls; > >> + private final WeakReference<Method> setter; > >> + > >> + private HostNameSetter(Class<?> clazz, Method setter) { > >> + this.cls = new WeakReference<Class<?>>(clazz); > >> + this.setter = setter == null ? null : new > >WeakReference<>(setter); > >> + } > >> + > >> + private static Method init(Class<?> cls) { > >> + Method s = null; > >> + try { > >> + s = cls.getMethod("setHost", String.class); > >> + } catch (Exception e) { > >> + initFail(e); > >> + } > >> + CURRENT.set(new HostNameSetter(cls, s)); > >> + return s; > >> + } > >> + > >> + > >> + > >> + private static void initFail(Exception e) { > >> + // ignore > >> + } > >> + > >> + private Method reuse(Class<?> cls) { > >> + final boolean wrongClass = this.cls.get() != cls; > >> + if (wrongClass) { > >> + return init(cls); > >> + } > >> + > >> + final boolean setterNotSupported = this.setter == null; > >> + if (setterNotSupported) { > >> + return null; > >> + } > >> + > >> + final Method s = setter.get(); > >> + final boolean setterLost = s == null; > >> + return setterLost ? init(cls) : s; > >> + } > >> + > >> + /** > >> + * Invokes the {@code #setName(String)} method if one is > >present. > >> + * > >> + * @param hostname the name to set > >> + * @param sslsock the socket > >> + */ > >> + public static void setServerNameIndication(String hostname, > >SSLSocket sslsock) { > >> + final Class<?> cls = sslsock.getClass(); > >> + final HostNameSetter current = CURRENT.get(); > >> + final Method setter = (current == null) ? init(cls) : > >current.reuse(cls); > >> + if (setter != null) { > >> + try { > >> + setter.invoke(sslsock, hostname); > >> + } catch (IllegalArgumentException > >> + | IllegalAccessException > >> + | InvocationTargetException e) { > >> + setServerNameIndicationFail(e); > >> + } > >> + } > >> + } > >> + > >> + private static void setServerNameIndicationFail(Exception e) { > >> + // ignore > >> + } > >> +} > >> \ No newline at end of file > >> > >> Propchange: > >jmeter/trunk/src/core/org/apache/jmeter/util/HostNameSetter.java > >> > >----------------------------------------------------------- > ------------------- > >> svn:mime-type = text/plain > >> > >> Modified: > >jmeter/trunk/src/core/org/apache/jmeter/util/SlowSSLSocket.java > >> URL: > >http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/ > apache/jmeter/util/SlowSSLSocket.java?rev=1754681&r1=1754680&r2=1754681& > view=diff > >> > >=========================================================== > =================== > >> --- jmeter/trunk/src/core/org/apache/jmeter/util/SlowSSLSocket.java > >(original) > >> +++ jmeter/trunk/src/core/org/apache/jmeter/util/SlowSSLSocket.java > >Sun Jul 31 20:07:10 2016 > >> @@ -22,6 +22,7 @@ import java.io.IOException; > >> import java.io.InputStream; > >> import java.io.OutputStream; > >> import java.net.InetAddress; > >> +import java.net.InetSocketAddress; > >> import java.net.SocketAddress; > >> import java.net.SocketException; > >> import java.nio.channels.SocketChannel; > >> @@ -174,6 +175,12 @@ public class SlowSSLSocket extends SSLSo > >> > >> @Override > >> public void connect(SocketAddress endpoint, int timeout) throws > >IOException { > >> + // see Bug 59902 > >> + if(endpoint instanceof InetSocketAddress) { > >> + InetSocketAddress address = > >> + (InetSocketAddress) endpoint; > >> + > >HostNameSetter.setServerNameIndication(address.getHostString(), > >sslSock); > >> + } > >> sslSock.connect(endpoint, timeout); > >> } > >> > >> > >> Modified: > >jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/ > JMeterClientConnectionOperator.java > >> URL: > >http://svn.apache.org/viewvc/jmeter/trunk/src/protocol/ > http/org/apache/jmeter/protocol/http/sampler/ > JMeterClientConnectionOperator.java?rev=1754681&r1=1754680& > r2=1754681&view=diff > >> > >=========================================================== > =================== > >> --- > >jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/ > JMeterClientConnectionOperator.java > >(original) > >> +++ > >jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/ > JMeterClientConnectionOperator.java > >Sun Jul 31 20:07:10 2016 > >> @@ -25,11 +25,7 @@ > >> package org.apache.jmeter.protocol.http.sampler; > >> > >> import java.io.IOException; > >> -import java.lang.ref.WeakReference; > >> -import java.lang.reflect.InvocationTargetException; > >> -import java.lang.reflect.Method; > >> import java.net.Socket; > >> -import java.util.concurrent.atomic.AtomicReference; > >> > >> import javax.net.ssl.SSLSocket; > >> > >> @@ -39,6 +35,7 @@ import org.apache.http.conn.OperatedClie > >> import org.apache.http.conn.scheme.SchemeRegistry; > >> import org.apache.http.impl.conn.DefaultClientConnection; > >> import org.apache.http.impl.conn.DefaultClientConnectionOperator; > >> +import org.apache.jmeter.util.HostNameSetter; > >> > >> /** > >> * Custom implementation of {@link DefaultClientConnectionOperator} > >to fix SNI Issue > >> @@ -90,78 +87,4 @@ public class JMeterClientConnectionOpera > >> } > >> } > >> } > >> - > >> - /** > >> - * Uses the underlying implementation to support Server Name > >Indication (SNI). > >> - * @author Michael Locher <cmb...@gmail.com <javascript:;>> > >> - * @see <a > >href="https://issues.apache.org/jira/browse/HTTPCLIENT-1119 > ">HTTPCLIENT-1119</a> > >> - */ > >> - private static class HostNameSetter { > >> - > >> - private static final AtomicReference<HostNameSetter> CURRENT > >= new AtomicReference<>(); > >> - > >> - private final WeakReference<Class<?>> cls; > >> - private final WeakReference<Method> setter; > >> - > >> - private HostNameSetter(Class<?> clazz, Method setter) { > >> - this.cls = new WeakReference<Class<?>>(clazz); > >> - this.setter = setter == null ? null : new > >WeakReference<>(setter); > >> - } > >> - > >> - private static Method init(Class<?> cls) { > >> - Method s = null; > >> - try { > >> - s = cls.getMethod("setHost", String.class); > >> - } catch (SecurityException | NoSuchMethodException e) { > >> - initFail(e); > >> - } > >> - CURRENT.set(new HostNameSetter(cls, s)); > >> - return s; > >> - } > >> - > >> - private static void initFail(Exception e) { > >> - // ignore > >> - } > >> - > >> - private Method reuse(Class<?> cls) { > >> - final boolean wrongClass = this.cls.get() != cls; > >> - if (wrongClass) { > >> - return init(cls); > >> - } > >> - > >> - final boolean setterNotSupported = this.setter == null; > >> - if (setterNotSupported) { > >> - return null; > >> - } > >> - > >> - final Method s = setter.get(); > >> - final boolean setterLost = s == null; > >> - return setterLost ? init(cls) : s; > >> - } > >> - > >> - /** > >> - * Invokes the {@code #setName(String)} method if one is > >present. > >> - * > >> - * @param hostname the name to set > >> - * @param sslsock the socket > >> - */ > >> - public static void setServerNameIndication(String hostname, > >SSLSocket sslsock) { > >> - final Class<?> cls = sslsock.getClass(); > >> - final HostNameSetter current = CURRENT.get(); > >> - final Method setter = (current == null) ? init(cls) : > >current.reuse(cls); > >> - if (setter != null) { > >> - try { > >> - setter.invoke(sslsock, hostname); > >> - } catch (IllegalArgumentException > >> - | IllegalAccessException > >> - | InvocationTargetException e) { > >> - setServerNameIndicationFail(e); > >> - } > >> - } > >> - } > >> - > >> - private static void setServerNameIndicationFail(Exception e) > >{ > >> - // ignore > >> - } > >> - } > >> } > >> > >> Modified: jmeter/trunk/xdocs/changes.xml > >> URL: > >http://svn.apache.org/viewvc/jmeter/trunk/xdocs/changes. > xml?rev=1754681&r1=1754680&r2=1754681&view=diff > >> > >=========================================================== > =================== > >> --- jmeter/trunk/xdocs/changes.xml [utf-8] (original) > >> +++ jmeter/trunk/xdocs/changes.xml [utf-8] Sun Jul 31 20:07:10 2016 > >> @@ -138,6 +138,7 @@ Summary > >> <h3>HTTP Samplers and Test Script Recorder</h3> > >> <ul> > >> <li><bug>58888</bug>HTTP(S) Test Script Recorder (ProxyControl) > >does not add TestElement's returned by SamplerCreator createChildren > >()</li> > >> + <li><bug>59902</bug>Https handshake failure when setting > ><code>httpclient.socket.https.cps</code> property</li> > >> </ul> > >> > >> <h3>Other Samplers</h3> > >> > >> > > -- Cordialement. Philippe Mouawad.