Bug 63129 - JMeter can not identify encoding during first time page submission

This closes #441
Bugzilla Id: 63129

git-svn-id: https://svn.apache.org/repos/asf/jmeter/trunk@1859523 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Philippe Mouawad 2019-05-19 20:55:31 +00:00
parent 89df5a1e65
commit 74ce954f3e
8 changed files with 53 additions and 13 deletions

View File

@ -831,6 +831,7 @@ proxy_daemon_msg_created_in_bin=created in JMeter bin directory
proxy_daemon_msg_check_expiration=Certificate has a duration validity of {0} days, <br>if the created one (see below) is newer than the last one you installed, <br>ensure you remove the old one and install the new one. proxy_daemon_msg_check_expiration=Certificate has a duration validity of {0} days, <br>if the created one (see below) is newer than the last one you installed, <br>ensure you remove the old one and install the new one.
proxy_daemon_msg_install_as_in_doc=You can install it following instructions in <i>Component Reference</i> documentation <br>See <i>Installing the JMeter CA certificate for HTTPS recording</i> paragraph. proxy_daemon_msg_install_as_in_doc=You can install it following instructions in <i>Component Reference</i> documentation <br>See <i>Installing the JMeter CA certificate for HTTPS recording</i> paragraph.
proxy_daemon_msg_rootca_cert=Root CA certificate proxy_daemon_msg_rootca_cert=Root CA certificate
proxy_default_encoding=Recording's default encoding
proxy_domains=HTTPS Domains\: proxy_domains=HTTPS Domains\:
proxy_domains_dynamic_mode_tooltip=List of domain names for HTTPS url, ex. jmeter.apache.org or wildcard domain like *.apache.org. Use comma as separator. proxy_domains_dynamic_mode_tooltip=List of domain names for HTTPS url, ex. jmeter.apache.org or wildcard domain like *.apache.org. Use comma as separator.
proxy_domains_dynamic_mode_tooltip_java6=To activate this field, use a Java 7+ runtime environment proxy_domains_dynamic_mode_tooltip_java6=To activate this field, use a Java 7+ runtime environment

View File

@ -820,6 +820,7 @@ proxy_daemon_msg_check_expiration=Le certificat a une durée de validité de {0}
proxy_daemon_msg_created_in_bin=créé dans le répertoire bin de JMeter proxy_daemon_msg_created_in_bin=créé dans le répertoire bin de JMeter
proxy_daemon_msg_install_as_in_doc=Vous pouvez l'installer en suivant les instructions de la documentation <i>Component Reference</i> <br> (voir le paragraphe <i>Installing the JMeter CA certificate for HTTPS recording</i>) proxy_daemon_msg_install_as_in_doc=Vous pouvez l'installer en suivant les instructions de la documentation <i>Component Reference</i> <br> (voir le paragraphe <i>Installing the JMeter CA certificate for HTTPS recording</i>)
proxy_daemon_msg_rootca_cert=Certificat AC raçine \: proxy_daemon_msg_rootca_cert=Certificat AC raçine \:
proxy_default_encoding=Encodage par défaut de l'enregistrement
proxy_domains=Domaines HTTPS \: proxy_domains=Domaines HTTPS \:
proxy_domains_dynamic_mode_tooltip=Liste de noms de domaine pour les url HTTPS, ex. jmeter.apache.org ou les domaines wildcard comme *.apache.org. Utiliser la virgule comme séparateur. proxy_domains_dynamic_mode_tooltip=Liste de noms de domaine pour les url HTTPS, ex. jmeter.apache.org ou les domaines wildcard comme *.apache.org. Utiliser la virgule comme séparateur.
proxy_domains_dynamic_mode_tooltip_java6=Pour activer ce champ, utiliser un environnement d'exécution Java 7+ proxy_domains_dynamic_mode_tooltip_java6=Pour activer ce champ, utiliser un environnement d'exécution Java 7+

View File

@ -38,7 +38,8 @@ public abstract class AbstractSamplerCreator implements SamplerCreator {
protected static final String HTTP = "http"; // $NON-NLS-1$ protected static final String HTTP = "http"; // $NON-NLS-1$
protected static final String HTTPS = "https"; // $NON-NLS-1$ protected static final String HTTPS = "https"; // $NON-NLS-1$
protected static final String DEFAULT_ENCODING_KEY = "__defaultEncoding"; // $NON-NLS-1$
/** FileType to be used for the temporary binary files*/ /** FileType to be used for the temporary binary files*/
private static final String BINARY_FILE_SUFFIX = private static final String BINARY_FILE_SUFFIX =
JMeterUtils.getPropDefault("proxy.binary.filesuffix",// $NON-NLS-1$ JMeterUtils.getPropDefault("proxy.binary.filesuffix",// $NON-NLS-1$

View File

@ -117,9 +117,9 @@ public class Daemon extends Thread implements Stoppable {
log.info("Test Script Recorder up and running!"); log.info("Test Script Recorder up and running!");
// Maps to contain page and form encodings // Maps to contain page and form encodings
// TODO - do these really need to be shared between all Proxy instances?
Map<String, String> pageEncodings = Collections.synchronizedMap(new HashMap<String, String>()); Map<String, String> pageEncodings = Collections.synchronizedMap(new HashMap<String, String>());
Map<String, String> formEncodings = Collections.synchronizedMap(new HashMap<String, String>()); Map<String, String> formEncodings = Collections.synchronizedMap(new HashMap<String, String>());
pageEncodings.put(AbstractSamplerCreator.DEFAULT_ENCODING_KEY, target.getDefaultEncoding());
try { try {
while (running) { while (running) {

View File

@ -386,22 +386,24 @@ public class DefaultSamplerCreator extends AbstractSamplerCreator {
} }
else { else {
// Check if we know the encoding of the page // Check if we know the encoding of the page
if (pageEncodings != null) { synchronized (pageEncodings) {
synchronized (pageEncodings) { contentEncoding = pageEncodings.get(urlWithoutQuery);
contentEncoding = pageEncodings.get(urlWithoutQuery); log.debug("Computed encoding:{} for url:{}", contentEncoding, urlWithoutQuery);
}
} }
// Check if we know the encoding of the form // Check if we know the encoding of the form
if (formEncodings != null) { synchronized (formEncodings) {
synchronized (formEncodings) { String formEncoding = formEncodings.get(urlWithoutQuery);
String formEncoding = formEncodings.get(urlWithoutQuery); // Form encoding has priority over page encoding
// Form encoding has priority over page encoding if (formEncoding != null) {
if (formEncoding != null) { contentEncoding = formEncoding;
contentEncoding = formEncoding; log.debug("Computed encoding:{} for url:{}", contentEncoding, urlWithoutQuery);
}
} }
} }
} }
if (contentEncoding == null) {
contentEncoding = pageEncodings.get(DEFAULT_ENCODING_KEY);
log.debug("Defaulting to encoding:{} for url:{}", contentEncoding, urlWithoutQuery);
}
return contentEncoding; return contentEncoding;
} }

View File

@ -25,6 +25,7 @@ import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.net.MalformedURLException; import java.net.MalformedURLException;
import java.nio.charset.StandardCharsets;
import java.security.GeneralSecurityException; import java.security.GeneralSecurityException;
import java.security.KeyStore; import java.security.KeyStore;
import java.security.UnrecoverableKeyException; import java.security.UnrecoverableKeyException;
@ -163,6 +164,8 @@ public class ProxyControl extends GenericController implements NonTestElement {
private static final String PREFIX_HTTP_SAMPLER_NAME = "ProxyControlGui.proxy_prefix_http_sampler_name"; // $NON-NLS-1$ private static final String PREFIX_HTTP_SAMPLER_NAME = "ProxyControlGui.proxy_prefix_http_sampler_name"; // $NON-NLS-1$
private static final String PROXY_PAUSE_HTTP_SAMPLER = "ProxyControlGui.proxy_pause_http_sampler"; // $NON-NLS-1$ private static final String PROXY_PAUSE_HTTP_SAMPLER = "ProxyControlGui.proxy_pause_http_sampler"; // $NON-NLS-1$
private static final String DEFAULT_ENCODING_PROPERTY = "ProxyControlGui.default_encoding"; // $NON-NLS-1$
private static final String REGEX_MATCH = "ProxyControlGui.regex_match"; // $NON-NLS-1$ private static final String REGEX_MATCH = "ProxyControlGui.regex_match"; // $NON-NLS-1$
@ -406,6 +409,13 @@ public class ProxyControl extends GenericController implements NonTestElement {
setProperty(new IntegerProperty(HTTP_SAMPLER_NAMING_MODE, httpNamingMode)); setProperty(new IntegerProperty(HTTP_SAMPLER_NAMING_MODE, httpNamingMode));
} }
public String getDefaultEncoding() {
return getPropertyAsString(DEFAULT_ENCODING_PROPERTY, StandardCharsets.UTF_8.name());
}
public void setDefaultEncoding(String defaultEncoding) {
setProperty(DEFAULT_ENCODING_PROPERTY, defaultEncoding);
}
public void setPrefixHTTPSampleName(String prefixHTTPSampleName) { public void setPrefixHTTPSampleName(String prefixHTTPSampleName) {
setProperty(PREFIX_HTTP_SAMPLER_NAME, prefixHTTPSampleName); setProperty(PREFIX_HTTP_SAMPLER_NAME, prefixHTTPSampleName);
} }

View File

@ -164,6 +164,11 @@ public class ProxyControlGui extends LogicControllerGui implements JMeterGUIComp
* Set/clear the Download images box on the samplers (default is false) * Set/clear the Download images box on the samplers (default is false)
*/ */
private JCheckBox samplerDownloadImages; private JCheckBox samplerDownloadImages;
/**
* Default enccoding for parsing
*/
private JTextField defaultEncoding;
/** /**
* To choose between a prefix or a transaction name * To choose between a prefix or a transaction name
@ -220,6 +225,8 @@ public class ProxyControlGui extends LogicControllerGui implements JMeterGUIComp
private transient RecorderDialog recorderDialog; private transient RecorderDialog recorderDialog;
private Component labelDefaultEncoding;
//+ action names //+ action names
private static final String ACTION_STOP = "stop"; // $NON-NLS-1$ private static final String ACTION_STOP = "stop"; // $NON-NLS-1$
@ -308,6 +315,7 @@ public class ProxyControlGui extends LogicControllerGui implements JMeterGUIComp
model.setUseKeepAlive(useKeepAlive.isSelected()); model.setUseKeepAlive(useKeepAlive.isSelected());
model.setSamplerDownloadImages(samplerDownloadImages.isSelected()); model.setSamplerDownloadImages(samplerDownloadImages.isSelected());
model.setHTTPSampleNamingMode(httpSampleNamingMode.getSelectedIndex()); model.setHTTPSampleNamingMode(httpSampleNamingMode.getSelectedIndex());
model.setDefaultEncoding(defaultEncoding.getText());
model.setPrefixHTTPSampleName(prefixHTTPSampleName.getText()); model.setPrefixHTTPSampleName(prefixHTTPSampleName.getText());
model.setProxyPauseHTTPSample(proxyPauseHTTPSample.getText()); model.setProxyPauseHTTPSample(proxyPauseHTTPSample.getText());
model.setNotifyChildSamplerListenerOfFilteredSamplers(notifyChildSamplerListenerOfFilteredSamplersCB.isSelected()); model.setNotifyChildSamplerListenerOfFilteredSamplers(notifyChildSamplerListenerOfFilteredSamplersCB.isSelected());
@ -372,6 +380,7 @@ public class ProxyControlGui extends LogicControllerGui implements JMeterGUIComp
samplerDownloadImages.setSelected(model.getSamplerDownloadImages()); samplerDownloadImages.setSelected(model.getSamplerDownloadImages());
httpSampleNamingMode.setSelectedIndex(model.getHTTPSampleNamingMode()); httpSampleNamingMode.setSelectedIndex(model.getHTTPSampleNamingMode());
prefixHTTPSampleName.setText(model.getPrefixHTTPSampleName()); prefixHTTPSampleName.setText(model.getPrefixHTTPSampleName());
defaultEncoding.setText(model.getDefaultEncoding());
proxyPauseHTTPSample.setText(model.getProxyPauseHTTPSample()); proxyPauseHTTPSample.setText(model.getProxyPauseHTTPSample());
notifyChildSamplerListenerOfFilteredSamplersCB.setSelected(model.getNotifyChildSamplerListenerOfFilteredSamplers()); notifyChildSamplerListenerOfFilteredSamplersCB.setSelected(model.getNotifyChildSamplerListenerOfFilteredSamplers());
regexMatch.setSelected(model.getRegexMatch()); regexMatch.setSelected(model.getRegexMatch());
@ -913,6 +922,8 @@ public class ProxyControlGui extends LogicControllerGui implements JMeterGUIComp
httpSampleNamingMode.setName(HTTP_SAMPLER_NAMING_MODE); httpSampleNamingMode.setName(HTTP_SAMPLER_NAMING_MODE);
httpSampleNamingMode.addItemListener(this); httpSampleNamingMode.addItemListener(this);
defaultEncoding = new JTextField(15);
prefixHTTPSampleName = new JTextField(20); prefixHTTPSampleName = new JTextField(20);
prefixHTTPSampleName.addKeyListener(this); prefixHTTPSampleName.addKeyListener(this);
prefixHTTPSampleName.setName(PREFIX_HTTP_SAMPLER_NAME); prefixHTTPSampleName.setName(PREFIX_HTTP_SAMPLER_NAME);
@ -923,6 +934,9 @@ public class ProxyControlGui extends LogicControllerGui implements JMeterGUIComp
proxyPauseHTTPSample.setActionCommand(ENABLE_RESTART); proxyPauseHTTPSample.setActionCommand(ENABLE_RESTART);
JLabel labelProxyPause = new JLabel(JMeterUtils.getResString("proxy_pause_http_sampler")); // $NON-NLS-1$ JLabel labelProxyPause = new JLabel(JMeterUtils.getResString("proxy_pause_http_sampler")); // $NON-NLS-1$
labelProxyPause.setLabelFor(proxyPauseHTTPSample); labelProxyPause.setLabelFor(proxyPauseHTTPSample);
JLabel labelDefaultEncoding = new JLabel(JMeterUtils.getResString("proxy_default_encoding")); // $NON-NLS-1$
labelDefaultEncoding.setLabelFor(defaultEncoding);
GridBagLayout gridBagLayout = new GridBagLayout(); GridBagLayout gridBagLayout = new GridBagLayout();
GridBagConstraints gbc = new GridBagConstraints(); GridBagConstraints gbc = new GridBagConstraints();
@ -950,6 +964,16 @@ public class ProxyControlGui extends LogicControllerGui implements JMeterGUIComp
gbc.fill = GridBagConstraints.HORIZONTAL; gbc.fill = GridBagConstraints.HORIZONTAL;
panel.add(proxyPauseHTTPSample, gbc.clone()); panel.add(proxyPauseHTTPSample, gbc.clone());
gbc.weightx = 1; gbc.weightx = 1;
gbc.gridx = 0;
gbc.gridy++;
panel.add(labelDefaultEncoding, gbc.clone());
gbc.gridx++;
gbc.weightx = 3;
gbc.fill = GridBagConstraints.HORIZONTAL;
panel.add(defaultEncoding, gbc.clone());
gbc.weightx = 1;
gbc.gridx = 0; gbc.gridx = 0;
gbc.gridy++; gbc.gridy++;
gbc.fill=GridBagConstraints.VERTICAL; gbc.fill=GridBagConstraints.VERTICAL;

View File

@ -135,6 +135,7 @@ to view the last major behaviors with the version 5.1.1.
<ul> <ul>
<li><bug>63298</bug>HTTP Requests with encoded URLs are being sent in decoded format</li> <li><bug>63298</bug>HTTP Requests with encoded URLs are being sent in decoded format</li>
<li><bug>63364</bug>When setting <code>subresults.disable_renaming=true</code>, sub results are still renamed using their parent SampleLabel while they shouldn't. Contributed by Ubik Load Pack (support at ubikloadpack.com)</li> <li><bug>63364</bug>When setting <code>subresults.disable_renaming=true</code>, sub results are still renamed using their parent SampleLabel while they shouldn't. Contributed by Ubik Load Pack (support at ubikloadpack.com)</li>
<li><bug>63129</bug>JMeter can not identify encoding during first time page submission</li>
</ul> </ul>
<h3>Other Samplers</h3> <h3>Other Samplers</h3>