Compare commits

...

8 Commits

Author SHA1 Message Date
pochopsp 1c67ca07cd
Merge bbce13d538 into 83e211fed7 2025-07-16 10:46:59 +05:30
Vladimir Sitnikov bbce13d538 refactor: factor out getEnabledArguments to avoid "isEnabled" check all over the place 2025-01-14 19:51:24 +03:00
pochopsp 4ea8f7e3de Remove unnecessary boolProp TestElement.enabled from TEST_HTTP.jmx 2024-11-08 22:23:44 +01:00
pochopsp 33e0cf467c Revert "Add missing enabled_from_gui to HTTPArgument in test files"
This reverts commit 45c45e7ba8.
2024-11-08 22:19:24 +01:00
pochopsp ad1638154d Use TestElementSchema.enabled instead of new HTTPArgumentSchema.enabledFromGui 2024-11-08 22:18:24 +01:00
pochopsp 75f5376a05 Merge branch 'master' into #5466-HTTP-disable-params 2024-11-01 13:54:51 +01:00
pochopsp 45c45e7ba8 Add missing enabled_from_gui to HTTPArgument in test files 2024-06-16 23:50:15 +02:00
pochopsp 06085e2866 feat: Add checkbox to enable/disable params in HTTP Sampler
Added a new "isEnabledFromGui" property in HTTPArgument used
to determine whether to include the argument in the request
or not.
This property is set by the user for each HTTP parameter by
clicking on the "Enable" column put on the very left of each
parameter row.

Fixes https://github.com/apache/jmeter/issues/5466
2024-06-11 23:55:33 +02:00
8 changed files with 38 additions and 21 deletions

View File

@ -23,11 +23,13 @@ import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.collections4.iterators.FilterIterator;
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.testelement.property.TestElementProperty;
import org.apache.jmeter.testelement.schema.PropertiesAccessor;
import org.apiguardian.api.API;
/**
* A set of Argument objects.
@ -100,7 +102,7 @@ public class Arguments extends ConfigTestElement implements Serializable, Iterab
// that this element's values prevail over defaults provided by
// configuration
// elements:
if (!argMap.containsKey(arg.getName())) {
if (!argMap.containsKey(arg.getName()) && arg.isEnabled()) {
argMap.put(arg.getName(), arg.getValue());
}
}
@ -173,6 +175,18 @@ public class Arguments extends ConfigTestElement implements Serializable, Iterab
return getArguments().iterator();
}
/**
* Returns the list of enabled arguments.
* @return the list of enabled arguments
*/
@API(since = "5.6", status = API.Status.EXPERIMENTAL)
public Iterable<JMeterProperty> getEnabledArguments() {
return () -> new FilterIterator<>(iterator(), property -> {
Object value = property.getObjectValue();
return value instanceof Argument && ((Argument) value).isEnabled();
});
}
/**
* Create a string representation of the arguments.
*

View File

@ -261,7 +261,7 @@ public class UrlConfigGui extends JPanel implements ChangeListener {
*/
private static String computePostBody(Arguments arguments, boolean crlfToLF) {
StringBuilder postBody = new StringBuilder();
for (JMeterProperty argument : arguments) {
for (JMeterProperty argument : arguments.getEnabledArguments()) {
HTTPArgument arg = (HTTPArgument) argument.getObjectValue();
String value = arg.getValue();
if (crlfToLF) {

View File

@ -39,12 +39,15 @@ import org.apache.jorphan.reflect.Functor;
/**
* A GUI panel allowing the user to enter HTTP Parameters.
* These have names and values, as well as check-boxes to determine whether or not to
* include the "=" sign in the output and whether or not to encode the output.
* include the "=" sign in the output and whether or not to encode the output and
* whether or not to enable them.
*/
public class HTTPArgumentsPanel extends ArgumentsPanel {
private static final long serialVersionUID = 240L;
private static final String ENABLE = "enable"; //$NON-NLS-1$
private static final String ENCODE_OR_NOT = "encode?"; //$NON-NLS-1$
private static final String INCLUDE_EQUALS = "include_equals"; //$NON-NLS-1$
@ -60,21 +63,23 @@ public class HTTPArgumentsPanel extends ArgumentsPanel {
@Override
protected void initializeTableModel() {
tableModel = new ObjectTableModel(new String[] {
ArgumentsPanel.COLUMN_RESOURCE_NAMES_0, ArgumentsPanel.COLUMN_RESOURCE_NAMES_1, ENCODE_OR_NOT, CONTENT_TYPE, INCLUDE_EQUALS },
ENABLE, ArgumentsPanel.COLUMN_RESOURCE_NAMES_0, ArgumentsPanel.COLUMN_RESOURCE_NAMES_1, ENCODE_OR_NOT, CONTENT_TYPE, INCLUDE_EQUALS },
HTTPArgument.class,
new Functor[] {
new Functor("isEnabled"), //$NON-NLS-1$
new Functor("getName"), //$NON-NLS-1$
new Functor("getValue"), //$NON-NLS-1$
new Functor("isAlwaysEncoded"), //$NON-NLS-1$
new Functor("getContentType"), //$NON-NLS-1$
new Functor("isUseEquals") }, //$NON-NLS-1$
new Functor[] {
new Functor("setEnabled"), //$NON-NLS-1$
new Functor("setName"), //$NON-NLS-1$
new Functor("setValue"), //$NON-NLS-1$
new Functor("setAlwaysEncoded"), //$NON-NLS-1$
new Functor("setContentType"),
new Functor("setUseEquals")}, //$NON-NLS-1$
new Class[] {String.class, String.class, Boolean.class, String.class, Boolean.class });
new Class[] {Boolean.class, String.class, String.class, Boolean.class, String.class, Boolean.class });
}
public static boolean testFunctors(){
@ -85,6 +90,7 @@ public class HTTPArgumentsPanel extends ArgumentsPanel {
@Override
protected void sizeColumns(JTable table) {
GuiUtils.fixSize(table.getColumn(ENABLE), table);
GuiUtils.fixSize(table.getColumn(INCLUDE_EQUALS), table);
GuiUtils.fixSize(table.getColumn(ENCODE_OR_NOT), table);
}

View File

@ -279,7 +279,7 @@ public class AjpSampler extends HTTPSamplerBase implements Interruptible {
setString(HTTPConstants.APPLICATION_X_WWW_FORM_URLENCODED);
StringBuilder sb = new StringBuilder();
boolean first = true;
for (JMeterProperty arg : getArguments()) {
for (JMeterProperty arg : getArguments().getEnabledArguments()) {
if (first) {
first = false;
} else {

View File

@ -159,7 +159,6 @@ import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.services.FileServer;
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.threads.JMeterVariables;
import org.apache.jmeter.util.JMeterUtils;
@ -1571,7 +1570,7 @@ public class HTTPHC4Impl extends HTTPHCAbstractImpl {
}
// Create the parts
// Add any parameters
for (JMeterProperty jMeterProperty : getArguments()) {
for (JMeterProperty jMeterProperty : getArguments().getEnabledArguments()) {
HTTPArgument arg = (HTTPArgument) jMeterProperty.getObjectValue();
String parameterName = arg.getName();
if (arg.isSkippable(parameterName)) {
@ -1653,7 +1652,7 @@ public class HTTPHC4Impl extends HTTPHCAbstractImpl {
// Just append all the parameter values, and use that as the post body
StringBuilder postBody = new StringBuilder();
for (JMeterProperty jMeterProperty : getArguments()) {
for (JMeterProperty jMeterProperty : getArguments().getEnabledArguments()) {
HTTPArgument arg = (HTTPArgument) jMeterProperty.getObjectValue();
postBody.append(arg.getEncodedValue(contentEncoding));
}
@ -1796,10 +1795,9 @@ public class HTTPHC4Impl extends HTTPHCAbstractImpl {
private UrlEncodedFormEntity createUrlEncodedFormEntity(final String urlContentEncoding) throws UnsupportedEncodingException {
// It is a normal request, with parameter names and values
// Add the parameters
PropertyIterator args = getArguments().iterator();
List<NameValuePair> nvps = new ArrayList<>();
while (args.hasNext()) {
HTTPArgument arg = (HTTPArgument) args.next().getObjectValue();
for (JMeterProperty jMeterProperty: getArguments().getEnabledArguments()) {
HTTPArgument arg = (HTTPArgument) jMeterProperty.getObjectValue();
// The HTTPClient always urlencodes both name and value,
// so if the argument is already encoded, we have to decode
// it before adding it to the post request

View File

@ -81,7 +81,6 @@ import org.apache.jmeter.testelement.TestStateListener;
import org.apache.jmeter.testelement.ThreadListener;
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.testelement.schema.PropertiesAccessor;
import org.apache.jmeter.testelement.schema.PropertyDescriptor;
import org.apache.jmeter.threads.JMeterContext;
@ -409,7 +408,7 @@ public abstract class HTTPSamplerBase extends AbstractSampler
return true;
} else {
boolean hasArguments = false;
for (JMeterProperty jMeterProperty : getArguments()) {
for (JMeterProperty jMeterProperty : getArguments().getEnabledArguments()) {
hasArguments = true;
HTTPArgument arg = (HTTPArgument) jMeterProperty.getObjectValue();
if (arg.getName() != null && !arg.getName().isEmpty()) {
@ -1155,9 +1154,10 @@ public abstract class HTTPSamplerBase extends AbstractSampler
*/
public String getQueryString(final String contentEncoding) {
CollectionProperty arguments = getArguments().getArguments();
Arguments args = getArguments();
Iterator<JMeterProperty> iter = args.getEnabledArguments().iterator();
// Optimisation : avoid building useless objects if empty arguments
if(arguments.isEmpty()) {
if (!iter.hasNext()) {
return "";
}
String lContentEncoding = contentEncoding;
@ -1167,8 +1167,7 @@ public abstract class HTTPSamplerBase extends AbstractSampler
lContentEncoding = EncoderCache.URL_ARGUMENT_ENCODING;
}
StringBuilder buf = new StringBuilder(arguments.size() * 15);
PropertyIterator iter = arguments.iterator();
StringBuilder buf = new StringBuilder(args.getArgumentCount() * 15);
boolean first = true;
while (iter.hasNext()) {
HTTPArgument item = null;

View File

@ -190,7 +190,7 @@ public class PostWriter {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(bos, contentEncoding);
// Add any parameters
for (JMeterProperty jMeterProperty : sampler.getArguments()) {
for (JMeterProperty jMeterProperty : sampler.getArguments().getEnabledArguments()) {
HTTPArgument arg = (HTTPArgument) jMeterProperty.getObjectValue();
String parameterName = arg.getName();
if (arg.isSkippable(parameterName)) {
@ -299,7 +299,7 @@ public class PostWriter {
// Just append all the parameter values, and use that as the post body
StringBuilder postBodyBuffer = new StringBuilder();
for (JMeterProperty jMeterProperty : sampler.getArguments()) {
for (JMeterProperty jMeterProperty : sampler.getArguments().getEnabledArguments()) {
HTTPArgument arg = (HTTPArgument) jMeterProperty.getObjectValue();
postBodyBuffer.append(arg.getEncodedValue(contentEncoding));
}

View File

@ -84,7 +84,7 @@ public class PutWriter extends PostWriter {
// Just append all the parameter values, and use that as the put body
StringBuilder putBodyBuffer = new StringBuilder();
for (JMeterProperty jMeterProperty : sampler.getArguments()) {
for (JMeterProperty jMeterProperty : sampler.getArguments().getEnabledArguments()) {
HTTPArgument arg = (HTTPArgument) jMeterProperty.getObjectValue();
putBodyBuffer.append(arg.getEncodedValue(contentEncoding));
}