Skip to content

Commit

Permalink
refactor: factor out getEnabledArguments to avoid "isEnabled" check a…
Browse files Browse the repository at this point in the history
…ll over the place
  • Loading branch information
vlsi committed Jan 14, 2025
1 parent 4ea8f7e commit c8b378f
Show file tree
Hide file tree
Showing 8 changed files with 30 additions and 39 deletions.
16 changes: 15 additions & 1 deletion src/core/src/main/java/org/apache/jmeter/config/Arguments.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,13 @@
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.
Expand Down Expand Up @@ -100,7 +102,7 @@ public Map<String, String> getArgumentsAsMap() {
// 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());
}
}
Expand Down Expand Up @@ -173,6 +175,18 @@ public PropertyIterator iterator() {
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.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -261,11 +261,8 @@ private static String computePostBody(Arguments arguments) {
*/
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();
if (!arg.isEnabled()) {
continue; // Skip parameters if they've been disabled from GUI using the checkbox
}
String value = arg.getValue();
if (crlfToLF) {
value = value.replaceAll("\r\n", "\n"); // See modifyTestElement
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -279,7 +279,7 @@ private String setConnectionHeaders(URL url, String host, String method)
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 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1571,15 +1571,12 @@ protected String setupHttpEntityEnclosingRequestData(HttpEntityEnclosingRequestB
}
// 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)) {
continue;
}
if (!arg.isEnabled()) {
continue; // Skip parameters if they've been disabled from GUI using the checkbox
}
ContentType contentType;
if (arg.getContentType().indexOf(';') >= 0) {
// assume, that the content type contains charset info
Expand Down Expand Up @@ -1656,11 +1653,8 @@ else if(ADD_CONTENT_TYPE_TO_POST_IF_MISSING) {

// 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();
if (!arg.isEnabled()) {
continue; // Skip parameters if they've been disabled from GUI using the checkbox
}
postBody.append(arg.getEncodedValue(contentEncoding));
}
// Let StringEntity perform the encoding
Expand Down Expand Up @@ -1802,20 +1796,16 @@ else if(getSendParameterValuesAsPostBody()) {
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
String parameterName = arg.getName();
if (arg.isSkippable(parameterName)) {
continue;
}
if (!arg.isEnabled()) {
continue; // Skip parameters if they've been disabled from GUI using the checkbox
}
String parameterValue = arg.getValue();
if (!arg.isAlwaysEncoded()) {
// The value is already encoded by the user
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -409,7 +409,7 @@ public boolean getSendParameterValuesAsPostBody() {
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()) {
Expand Down Expand Up @@ -1155,9 +1155,10 @@ public String getQueryString() {
*/
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;
Expand All @@ -1167,8 +1168,7 @@ public String getQueryString(final String contentEncoding) {
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;
Expand All @@ -1186,12 +1186,6 @@ public String getQueryString(final String contentEncoding) {
item = new HTTPArgument((Argument) objectValue);
}
final String encodedName = item.getEncodedName();
if (encodedName.isEmpty()) {
continue; // Skip parameters with a blank name (allows use of optional variables in parameter lists)
}
if(!item.isEnabled()){
continue; // Skip parameters if they've been disabled from GUI using the checkbox
}
if (!first) {
buf.append(QRY_SEP);
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ public void setHeaders(URLConnection connection, HTTPSamplerBase sampler) throws
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)) {
Expand Down Expand Up @@ -299,7 +299,7 @@ public void setHeaders(URLConnection connection, HTTPSamplerBase sampler) throws

// 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));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,11 +84,8 @@ else if(sampler.getSendParameterValuesAsPostBody()) {

// 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();
if (!arg.isEnabled()) {
continue; // Skip parameters if they've been disabled from GUI using the checkbox
}
putBodyBuffer.append(arg.getEncodedValue(contentEncoding));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -134,15 +134,14 @@ public HTTPArgument(String name, String value, boolean alreadyEncoded) {
}

/**
* Construct a new HTTPArgument instance; enabled and alwaysEncoded set to true.
* Construct a new HTTPArgument instance; alwaysEncoded is set to true.
*
* @param name the name of the parameter
* @param value the value of the parameter
* @param alreadyEncoded true if the name and value is already encoded, in which case they are decoded before storage.
* @param contentEncoding the encoding used for the parameter value
*/
public HTTPArgument(String name, String value, boolean alreadyEncoded, String contentEncoding) {
setEnabled(true);
setAlwaysEncoded(true);
if (alreadyEncoded) {
try {
Expand Down

0 comments on commit c8b378f

Please sign in to comment.