You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jmeter.apache.org by pm...@apache.org on 2015/12/27 00:06:17 UTC

svn commit: r1721771 - in /jmeter/trunk: src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPHC4Impl.java xdocs/changes.xml

Author: pmouawad
Date: Sat Dec 26 23:06:17 2015
New Revision: 1721771

URL: http://svn.apache.org/viewvc?rev=1721771&view=rev
Log:
Bug 57804 - HTTP Request doesn't reuse cached SSL context when using Client Certificates in HTTPS
Bugzilla Id: 57804

Modified:
    jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPHC4Impl.java
    jmeter/trunk/xdocs/changes.xml

Modified: jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPHC4Impl.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPHC4Impl.java?rev=1721771&r1=1721770&r2=1721771&view=diff
==============================================================================
--- jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPHC4Impl.java (original)
+++ jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPHC4Impl.java Sat Dec 26 23:06:17 2015
@@ -72,6 +72,7 @@ import org.apache.http.client.methods.Ht
 import org.apache.http.client.methods.HttpUriRequest;
 import org.apache.http.client.params.ClientPNames;
 import org.apache.http.client.params.CookiePolicy;
+import org.apache.http.client.protocol.ClientContext;
 import org.apache.http.client.protocol.ResponseContentEncoding;
 import org.apache.http.conn.ClientConnectionManager;
 import org.apache.http.conn.ConnectionKeepAliveStrategy;
@@ -120,6 +121,7 @@ import org.apache.jmeter.services.FileSe
 import org.apache.jmeter.testelement.property.CollectionProperty;
 import org.apache.jmeter.testelement.property.JMeterProperty;
 import org.apache.jmeter.testelement.property.PropertyIterator;
+import org.apache.jmeter.threads.JMeterContextService;
 import org.apache.jmeter.util.JMeterUtils;
 import org.apache.jmeter.util.JsseSSLManager;
 import org.apache.jmeter.util.SSLManager;
@@ -201,6 +203,8 @@ public class HTTPHC4Impl extends HTTPHCA
      */
     private static final HttpParams DEFAULT_HTTP_PARAMS;
 
+    private static final String USER_TOKEN = "__jmeter.USER_TOKEN__"; //$NON-NLS-1$
+
     static {
         log.info("HTTP request retry count = "+RETRY_COUNT);
         
@@ -313,6 +317,7 @@ public class HTTPHC4Impl extends HTTPHCA
         }
 
         HttpContext localContext = new BasicHttpContext();
+        setupClientContextBeforeSample(localContext);
         
         res.sampleStart();
 
@@ -332,6 +337,7 @@ public class HTTPHC4Impl extends HTTPHCA
 
             // Needs to be done after execute to pick up all the headers
             final HttpRequest request = (HttpRequest) localContext.getAttribute(ExecutionContext.HTTP_REQUEST);
+            extractClientContextAfterSample(localContext);
             // We've finished with the request, so we can add the LocalAddress to it for display
             final InetAddress localAddr = (InetAddress) httpRequest.getParams().getParameter(ConnRoutePNames.LOCAL_ADDRESS);
             if (localAddr != null) {
@@ -434,6 +440,45 @@ public class HTTPHC4Impl extends HTTPHCA
     }
 
     /**
+     * Store in JMeter Variables the UserToken so that the SSL context is reused
+     * See https://bz.apache.org/bugzilla/show_bug.cgi?id=57804
+     * @param localContext {@link HttpContext}
+     */
+    private final void extractClientContextAfterSample(HttpContext localContext) {
+        Object userToken = localContext.getAttribute(ClientContext.USER_TOKEN);
+        if(userToken != null) {
+            if(log.isDebugEnabled()) {
+                log.debug("Extracted from HttpContext user token:"+userToken+", storing it as JMeter variable:"+USER_TOKEN);
+            }
+            JMeterContextService.getContext().getVariables().putObject(USER_TOKEN, userToken); 
+        }
+    }
+
+    /**
+     * Configure the UserToken so that the SSL context is reused
+     * See https://bz.apache.org/bugzilla/show_bug.cgi?id=57804
+     * @param localContext {@link HttpContext}
+     */
+    private final void setupClientContextBeforeSample(HttpContext localContext) {
+        Object userToken = JMeterContextService.getContext().getVariables().getObject(USER_TOKEN);
+        if(userToken != null) {
+            if(log.isDebugEnabled()) {
+                log.debug("Found user token:"+userToken+" as JMeter variable:"+USER_TOKEN+", storing it in HttpContext");
+            }
+            localContext.setAttribute(ClientContext.USER_TOKEN, userToken);
+        } else {
+            // It would be better to create a ClientSessionManager that would compute this value
+            // for now it can be Thread.currentThread().getName() but must be changed when we would change 
+            // the Thread per User model
+            String userId = Thread.currentThread().getName();
+            if(log.isDebugEnabled()) {
+                log.debug("Storing in HttpContext the user token:"+userId);
+            }
+            localContext.setAttribute(ClientContext.USER_TOKEN, userId);
+        }
+    }
+
+    /**
      * Calls {@link #sendPostData(HttpPost)} if method is <code>POST</code> and
      * {@link #sendEntityData(HttpEntityEnclosingRequestBase)} if method is
      * <code>PUT</code> or <code>PATCH</code>

Modified: jmeter/trunk/xdocs/changes.xml
URL: http://svn.apache.org/viewvc/jmeter/trunk/xdocs/changes.xml?rev=1721771&r1=1721770&r2=1721771&view=diff
==============================================================================
--- jmeter/trunk/xdocs/changes.xml (original)
+++ jmeter/trunk/xdocs/changes.xml Sat Dec 26 23:06:17 2015
@@ -190,6 +190,7 @@ Summary
     <li><bug>58137</bug>JMeter fails to download embedded URLS that contain illegal characters in URL (it does not escape them).</li>
     <li><bug>58201</bug>Make usage of port in the host header more consistent across the different http samplers.</li>
     <li><bug>58453</bug>HTTP Test Script Recorder : NullPointerException when disabling Capture HTTP Headers </li>
+    <li><bug>57804</bug>HTTP Request doesn't reuse cached SSL context when using Client Certificates in HTTPS (only fixed for HttpClient4 implementation)</li>
 </ul>
 
 <h3>Other Samplers</h3>