You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jmeter.apache.org by se...@apache.org on 2013/09/11 01:29:24 UTC
svn commit: r1521679 - in /jmeter/trunk: bin/jmeter.properties
src/protocol/http/org/apache/jmeter/protocol/http/proxy/ProxyControl.java
xdocs/changes.xml xdocs/usermanual/component_reference.xml
Author: sebb
Date: Tue Sep 10 23:29:23 2013
New Revision: 1521679
URL: http://svn.apache.org/r1521679
Log:
Proxy recording and redirects
Added code to disable redirected samples.
Bugzilla Id: 55531
Modified:
jmeter/trunk/bin/jmeter.properties
jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/proxy/ProxyControl.java
jmeter/trunk/xdocs/changes.xml
jmeter/trunk/xdocs/usermanual/component_reference.xml
Modified: jmeter/trunk/bin/jmeter.properties
URL: http://svn.apache.org/viewvc/jmeter/trunk/bin/jmeter.properties?rev=1521679&r1=1521678&r2=1521679&view=diff
==============================================================================
--- jmeter/trunk/bin/jmeter.properties (original)
+++ jmeter/trunk/bin/jmeter.properties Tue Sep 10 23:29:23 2013
@@ -554,6 +554,10 @@ upgrade_properties=/bin/upgrade.properti
# If false, will revert to using a single key with no certificate
#proxy.cert.dynamic_keys=true
+# Whether to attempt disabling of samples that resulted from redirects
+# where the generated samples use auto-redirection
+#proxy.redirect.disabling=true
+
# SSL configuration
#proxy.ssl.protocol=SSLv3
Modified: jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/proxy/ProxyControl.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/proxy/ProxyControl.java?rev=1521679&r1=1521678&r2=1521679&view=diff
==============================================================================
--- jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/proxy/ProxyControl.java (original)
+++ jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/proxy/ProxyControl.java Tue Sep 10 23:29:23 2013
@@ -60,6 +60,7 @@ import org.apache.jmeter.gui.tree.JMeter
import org.apache.jmeter.protocol.http.control.HeaderManager;
import org.apache.jmeter.protocol.http.control.RecordingController;
import org.apache.jmeter.protocol.http.gui.HeaderPanel;
+import org.apache.jmeter.protocol.http.sampler.HTTPSampleResult;
import org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase;
import org.apache.jmeter.protocol.http.sampler.HTTPSamplerFactory;
import org.apache.jmeter.samplers.SampleEvent;
@@ -202,7 +203,7 @@ public class ProxyControl extends Generi
}
static final KeystoreMode KEYSTORE_MODE;
-
+
static {
if (CERT_ALIAS != null) {
KEYSTORE_MODE = KeystoreMode.USER_KEYSTORE;
@@ -218,6 +219,18 @@ public class ProxyControl extends Generi
}
}
+ // Whether to use the redirect disabling feature (can be switched off if it does not work)
+ private static final boolean ATTEMPT_REDIRECT_DISABLING =
+ JMeterUtils.getPropDefault("proxy.redirect.disabling", true); // $NON-NLS-1$
+
+ // Although this field is mutable, it is only accessed within the synchronized method deliverSampler()
+ private static String LAST_REDIRECT = null;
+ /*
+ * TODO this assumes that the redirected response will always immediately follow the original response.
+ * This may not always be true.
+ * Is there a better way to do this?
+ */
+
private transient Daemon server;
private long lastTime = 0;// When was the last sample seen?
@@ -483,6 +496,26 @@ public class ProxyControl extends Generi
*/
public synchronized void deliverSampler(final HTTPSamplerBase sampler, final TestElement[] subConfigs, final SampleResult result) {
if (sampler != null) {
+ if (ATTEMPT_REDIRECT_DISABLING && (samplerRedirectAutomatically || samplerFollowRedirects)) {
+ if (result instanceof HTTPSampleResult) {
+ final HTTPSampleResult httpSampleResult = (HTTPSampleResult) result;
+ final String urlAsString = httpSampleResult.getUrlAsString();
+ if (urlAsString.equals(LAST_REDIRECT)) { // the url matches the last redirect
+ sampler.setEnabled(false);
+ sampler.setComment("Detected a redirect from the previous sample");
+ } else { // this is not the result of a redirect
+ LAST_REDIRECT = null; // so break the chain
+ }
+ if (httpSampleResult.isRedirect()) { // Save Location so resulting sample can be disabled
+ if (LAST_REDIRECT == null) {
+ sampler.setComment("Detected the start of a redirect chain");
+ }
+ LAST_REDIRECT = httpSampleResult.getRedirectLocation();
+ } else {
+ LAST_REDIRECT = null;
+ }
+ }
+ }
if (filterContentType(result) && filterUrl(sampler)) {
JMeterTreeNode myTarget = findTargetControllerNode();
@SuppressWarnings("unchecked") // OK, because find only returns correct element types
@@ -1159,7 +1192,7 @@ public class ProxyControl extends Generi
initUserKeyStore();
break;
default:
- throw new IllegalStateException("Impossible case: " + KEYSTORE_MODE);
+ throw new IllegalStateException("Impossible case: " + KEYSTORE_MODE);
}
}
Modified: jmeter/trunk/xdocs/changes.xml
URL: http://svn.apache.org/viewvc/jmeter/trunk/xdocs/changes.xml?rev=1521679&r1=1521678&r2=1521679&view=diff
==============================================================================
--- jmeter/trunk/xdocs/changes.xml (original)
+++ jmeter/trunk/xdocs/changes.xml Tue Sep 10 23:29:23 2013
@@ -361,6 +361,7 @@ Previously the default was 1, which coul
<li><bugzilla>54874</bugzilla> - Support device in addition to source IP address. Based on patch by Dan Fruehauf (malkodan at gmail.com)</li>
<li><bugzilla>55488</bugzilla> - Add .ico and .woff file extension to default suggested exclusions in proxy recorder. Contributed by Antonio Gomes Rodrigues</li>
<li><bugzilla>55525</bugzilla> - Proxy should support alias for keyserver entry</li>
+<li><bugzilla>55531</bugzilla> - Proxy recording and redirects. Added code to disable redirected samples.</li>
</ul>
<h3>Other samplers</h3>
Modified: jmeter/trunk/xdocs/usermanual/component_reference.xml
URL: http://svn.apache.org/viewvc/jmeter/trunk/xdocs/usermanual/component_reference.xml?rev=1521679&r1=1521678&r2=1521679&view=diff
==============================================================================
--- jmeter/trunk/xdocs/usermanual/component_reference.xml (original)
+++ jmeter/trunk/xdocs/usermanual/component_reference.xml Tue Sep 10 23:29:23 2013
@@ -5835,17 +5835,18 @@ This setting will also be needed when ru
During recording, the browser will follow a redirect response and generate an additional request.
The Proxy will record both the original request and the redirected request
(subject to whatever exclusions are configured).
-The generated samples have "Follow Redirects" selected by default,
-so when a test plan is replayed, JMeter will follow the redirect,
-and then replay the redirect request that was recorded.
-To avoid this duplicate replay, either delete the redirected sample from the test plan,
-or ensure that the recorded samples don't have "Follow Redirects" selected.
-The default of "Follow Redirects" was chosen because that is generally better.
-Redirects may depend on the original request, so repeating the originally recorded sample may not always work.
+The generated samples have "Follow Redirects" selected by default, because that is generally better.
+[Redirects may depend on the original request, so repeating the originally recorded sample may not always work.]
</p>
<p>
-It is hoped (eventually) to be able to detect redirects during recording and drop/disable them
-so they don't get replayed.
+Now if JMeter is set to follow the redirect during replay, it will issue the original request,
+and then replay the redirect request that was recorded.
+To avoid this duplicate replay, JMeter tries to detect when a sample is the result of a previous
+redirect. If the current response is a redirect, JMeter will save the redirect URL.
+When the next request is received, it is compared with the saved redirect URL and if there is a match,
+JMeter will disable the generated sample. It also adds comments to the redirect chain.
+This assumes that all the requests in a redirect chain will follow each other without any intervening requests.
+To disable the redirect detection, set the property <code>proxy.redirect.disabling=false</code>
</p>
<h4>Includes and Excludes</h4>