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 2019/05/26 12:52:36 UTC

svn commit: r1860065 - /jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPHC4Impl.java

Author: pmouawad
Date: Sun May 26 12:52:36 2019
New Revision: 1860065

URL: http://svn.apache.org/viewvc?rev=1860065&view=rev
Log:
Bug 62672 - HTTP Request send double requests when configure proxy with authentication

Fix NPE
Bugzilla Id: 62672

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

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=1860065&r1=1860064&r2=1860065&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 Sun May 26 12:52:36 2019
@@ -180,7 +180,10 @@ public class HTTPHC4Impl extends HTTPHCA
     
     static final String CONTEXT_ATTRIBUTE_SAMPLER_RESULT = "__jmeter.S_R__"; //$NON-NLS-1$
     
-    private static final String CONTEXT_ATTRIBUTE_HTTPCLIENT_TOKEN = "__jmeter.H_T__";
+    /**
+     * Holds data used by HTTP request if Embedded resource download is enabled
+     */
+    private static final String CONTEXT_ATTRIBUTE_PARENT_SAMPLE_CLIENT_STATE = "__jmeter.H_T__";
 
     private static final String CONTEXT_ATTRIBUTE_CLIENT_KEY = "__jmeter.C_K__";
 
@@ -548,13 +551,8 @@ public class HTTPHC4Impl extends HTTPHCA
         HttpClientKey key = createHttpClientKey(url);
         MutableTriple<CloseableHttpClient, AuthState, PoolingHttpClientConnectionManager> triple;
         try {
-            httpClient = setupClient(key, jMeterVariables, clientContext);
-            // Cache triple for further use
-            Map<HttpClientKey, MutableTriple<CloseableHttpClient, AuthState, PoolingHttpClientConnectionManager>> 
-                mapHttpClientPerHttpClientKey =
-                    HTTPCLIENTS_CACHE_PER_THREAD_AND_HTTPCLIENTKEY.get();
-            triple =
-                    mapHttpClientPerHttpClientKey.get(key);
+            triple = setupClient(key, jMeterVariables, clientContext);
+            httpClient = triple.getLeft();
             URI uri = url.toURI();
             httpRequest = createHttpRequest(uri, method, areFollowingRedirect);
             setupRequest(url, httpRequest, res); // can throw IOException
@@ -695,7 +693,7 @@ public class HTTPHC4Impl extends HTTPHCA
         } finally {
             JOrphanUtils.closeQuietly(httpResponse);
             currentRequest = null;
-            JMeterContextService.getContext().getSamplerContext().remove(CONTEXT_ATTRIBUTE_HTTPCLIENT_TOKEN);
+            JMeterContextService.getContext().getSamplerContext().remove(CONTEXT_ATTRIBUTE_PARENT_SAMPLE_CLIENT_STATE);
         }
         return res;
     }
@@ -708,21 +706,19 @@ public class HTTPHC4Impl extends HTTPHCA
     private void saveProxyAuth(
             MutableTriple<CloseableHttpClient, AuthState, PoolingHttpClientConnectionManager> triple,
             HttpContext localContext) {
-        if (triple != null) {
-            triple.setMiddle((AuthState) localContext.getAttribute(HttpClientContext.PROXY_AUTH_STATE));
-        }
+        triple.setMiddle((AuthState) localContext.getAttribute(HttpClientContext.PROXY_AUTH_STATE));
     }
 
     /**
      * Store in localContext Proxy auth state of triple 
-     * @param triple {@link MutableTriple}
+     * @param triple {@link MutableTriple} May be null if first request
      * @param localContext {@link HttpContext}
      */
-    private void setupProxyAuth(MutableTriple<CloseableHttpClient, AuthState, PoolingHttpClientConnectionManager> triple,
+    private void setupProxyAuthState(MutableTriple<CloseableHttpClient, AuthState, PoolingHttpClientConnectionManager> triple,
                                 HttpContext localContext) {
         if (triple != null) {
-            AuthState proxy = triple.getMiddle();
-            localContext.setAttribute(HttpClientContext.PROXY_AUTH_STATE, proxy);
+            AuthState proxyAuthState = triple.getMiddle();
+            localContext.setAttribute(HttpClientContext.PROXY_AUTH_STATE, proxyAuthState);
         }
     }
 
@@ -993,22 +989,27 @@ public class HTTPHC4Impl extends HTTPHCA
         }
     }
 
-    private CloseableHttpClient setupClient(HttpClientKey key, JMeterVariables jMeterVariables,
+    private MutableTriple<CloseableHttpClient, AuthState, PoolingHttpClientConnectionManager> setupClient(HttpClientKey key, JMeterVariables jMeterVariables,
             HttpClientContext clientContext) throws GeneralSecurityException {
         Map<HttpClientKey, MutableTriple<CloseableHttpClient, AuthState, PoolingHttpClientConnectionManager>> mapHttpClientPerHttpClientKey =
                 HTTPCLIENTS_CACHE_PER_THREAD_AND_HTTPCLIENTKEY.get();
         clientContext.setAttribute(CONTEXT_ATTRIBUTE_CLIENT_KEY, key);
         CloseableHttpClient httpClient = null;
+        MutableTriple<CloseableHttpClient, AuthState, PoolingHttpClientConnectionManager> triple = null;
         boolean concurrentDwn = this.testElement.isConcurrentDwn();
+        Map<String, Object> samplerContext = JMeterContextService.getContext().getSamplerContext();
         if(concurrentDwn) {
-            httpClient = (CloseableHttpClient) JMeterContextService.getContext().getSamplerContext().get(CONTEXT_ATTRIBUTE_HTTPCLIENT_TOKEN);
+            triple = (MutableTriple<CloseableHttpClient, AuthState, PoolingHttpClientConnectionManager>) 
+                    samplerContext.get(CONTEXT_ATTRIBUTE_PARENT_SAMPLE_CLIENT_STATE);
+        }
+        if (triple == null) {
+            triple = mapHttpClientPerHttpClientKey.get(key);
         }
-        MutableTriple<CloseableHttpClient, AuthState, PoolingHttpClientConnectionManager> triple = 
-                mapHttpClientPerHttpClientKey.get(key);
-        if (httpClient == null) {
-            httpClient = triple != null ? triple.getLeft() : null;
+        
+        if(triple != null) {
+            httpClient = triple.getLeft();
         }
-        setupProxyAuth(triple, clientContext);
+        setupProxyAuthState(triple, clientContext);
         resetStateIfNeeded(triple, jMeterVariables, clientContext, mapHttpClientPerHttpClientKey);
 
         if (httpClient == null) { // One-time init for this client
@@ -1096,7 +1097,8 @@ public class HTTPHC4Impl extends HTTPHCA
             if (log.isDebugEnabled()) {
                 log.debug("Created new HttpClient: @{} {}", Integer.valueOf(System.identityHashCode(httpClient)), key);
             }
-            mapHttpClientPerHttpClientKey.put(key, MutableTriple.of(httpClient, null, pHCCM)); // save the agent for next time round
+            triple = MutableTriple.of(httpClient, null, pHCCM);
+            mapHttpClientPerHttpClientKey.put(key, triple); // save the agent for next time round
         } else {
             if (log.isDebugEnabled()) {
                 log.debug("Reusing the HttpClient: @{} {}", Integer.valueOf(System.identityHashCode(httpClient)),key);
@@ -1104,9 +1106,9 @@ public class HTTPHC4Impl extends HTTPHCA
         }
 
         if(concurrentDwn) {
-            JMeterContextService.getContext().getSamplerContext().put(CONTEXT_ATTRIBUTE_HTTPCLIENT_TOKEN, httpClient);
+            samplerContext.put(CONTEXT_ATTRIBUTE_PARENT_SAMPLE_CLIENT_STATE, triple);
         }
-        return httpClient;
+        return triple;
     }
 
     protected AuthenticationStrategy getProxyAuthStrategy() {