Index: src/protocol/http/org/apache/jmeter/protocol/http/config/gui/UrlConfigGui.java =================================================================== --- src/protocol/http/org/apache/jmeter/protocol/http/config/gui/UrlConfigGui.java (revision 1173768) +++ src/protocol/http/org/apache/jmeter/protocol/http/config/gui/UrlConfigGui.java (working copy) @@ -29,10 +29,12 @@ import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JPasswordField; +import javax.swing.JTabbedPane; import javax.swing.JTextField; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; +import org.apache.commons.lang.StringUtils; import org.apache.jmeter.config.Arguments; import org.apache.jmeter.config.ConfigTestElement; import org.apache.jmeter.gui.util.HorizontalPanel; @@ -43,9 +45,11 @@ import org.apache.jmeter.protocol.http.util.HTTPArgument; import org.apache.jmeter.testelement.TestElement; import org.apache.jmeter.testelement.property.BooleanProperty; +import org.apache.jmeter.testelement.property.PropertyIterator; import org.apache.jmeter.testelement.property.TestElementProperty; import org.apache.jmeter.util.JMeterUtils; import org.apache.jorphan.gui.JLabeledChoice; +import org.apache.jorphan.gui.JLabeledTextArea; /** * Basic URL / HTTP Request configuration: @@ -57,6 +61,9 @@ public class UrlConfigGui extends JPanel implements ChangeListener { private static final long serialVersionUID = 240L; + + public static final String POST_BODY_RAW = "HTTPSampler.postBodyRaw"; // + private HTTPArgumentsPanel argsPanel; @@ -101,6 +108,15 @@ private final boolean showImplementation; // Set false for AJP + // Raw POST Body + private JLabeledTextArea postBodyContent; + + // Choice between Parameters and Raw body + private JLabeledChoice postBodyMode; + + // Tabbed pane that contains parameters and raw body + private JTabbedPane postContentTabbedPane; + public UrlConfigGui() { this(true); } @@ -139,6 +155,9 @@ protocol.setText(""); // $NON-NLS-1$ contentEncoding.setText(""); // $NON-NLS-1$ argsPanel.clear(); + postBodyContent.setText("");// $NON-NLS-1$ + postBodyMode.setSelectedIndex(0); + postContentTabbedPane.setSelectedIndex(0); } public TestElement createTestElement() { @@ -157,10 +176,23 @@ * @param element */ public void modifyTestElement(TestElement element) { - Arguments args = (Arguments) argsPanel.createTestElement(); - - HTTPArgument.convertArgumentsToHTTP(args); - element.setProperty(new TestElementProperty(HTTPSamplerBase.ARGUMENTS, args)); + + if(postBodyMode.getSelectedIndex()==0) + { + Arguments args = (Arguments) argsPanel.createTestElement(); + HTTPArgument.convertArgumentsToHTTP(args); + element.setProperty(new TestElementProperty(HTTPSamplerBase.ARGUMENTS, args)); + element.setProperty(POST_BODY_RAW, false); + } + else + { + Arguments args = new Arguments(); + HTTPArgument arg = new HTTPArgument("", postBodyContent.getText(), true); + arg.setAlwaysEncoded(false); + args.addArgument(arg); + element.setProperty(new TestElementProperty(HTTPSamplerBase.ARGUMENTS, args)); + element.setProperty(POST_BODY_RAW, true); + } element.setProperty(HTTPSamplerBase.DOMAIN, domain.getText()); element.setProperty(HTTPSamplerBase.PORT, port.getText()); element.setProperty(HTTPSamplerBase.PROXYHOST, proxyHost.getText(),""); @@ -184,6 +216,24 @@ element.setProperty(HTTPSamplerBase.IMPLEMENTATION, httpImplementation.getText(),""); } } + + // FIXME FACTOR WITH HTTPHC4Impl, HTTPHC3Impl + // Just append all the parameter values, and use that as the post body + /** + * Compute Post body from arguments + * @param arguments {@link Arguments} + * @return {@link String} + */ + private static final String computePostBody(Arguments arguments) { + StringBuilder postBody = new StringBuilder(); + PropertyIterator args = arguments.iterator(); + while (args.hasNext()) { + HTTPArgument arg = (HTTPArgument) args.next().getObjectValue(); + String value = arg.getValue(); + postBody.append(value); + } + return postBody.toString(); + } /** * Set the text, etc. in the UI. @@ -193,7 +243,21 @@ */ public void configure(TestElement el) { setName(el.getName()); - argsPanel.configure((TestElement) el.getProperty(HTTPSamplerBase.ARGUMENTS).getObjectValue()); + Arguments arguments = (Arguments) el.getProperty(HTTPSamplerBase.ARGUMENTS).getObjectValue(); + + if(el.getPropertyAsBoolean(POST_BODY_RAW, false)|| + (arguments.getArgumentCount()==1 && StringUtils.isEmpty(arguments.getArgument(0).getName()))) + { + String postBody = computePostBody(arguments); + postBodyContent.setText(postBody); + postBodyMode.setSelectedIndex(1); + } + else + { + argsPanel.configure(arguments); + postBodyMode.setSelectedIndex(0); + } + domain.setText(el.getPropertyAsString(HTTPSamplerBase.DOMAIN)); String portString = el.getPropertyAsString(HTTPSamplerBase.PORT); @@ -227,6 +291,7 @@ } } + private void init() {// called from ctor, so must not be overridable this.setLayout(new BorderLayout()); @@ -433,10 +498,9 @@ useMultipartForPost.setSelected(false); useBrowserCompatibleMultipartMode = new JCheckBox(JMeterUtils.getResString("use_multipart_mode_browser")); // $NON-NLS-1$ - useBrowserCompatibleMultipartMode.setSelected(HTTPSamplerBase.BROWSER_COMPATIBLE_MULTIPART_MODE_DEFAULT); - + useBrowserCompatibleMultipartMode.setSelected(HTTPSamplerBase.BROWSER_COMPATIBLE_MULTIPART_MODE_DEFAULT); } - + JPanel pathPanel = new JPanel(new BorderLayout(5, 0)); pathPanel.add(label, BorderLayout.WEST); pathPanel.add(path, BorderLayout.CENTER); @@ -495,19 +559,32 @@ if (notConfigOnly){ panel.add(method); } + + postBodyMode = new JLabeledChoice( + JMeterUtils.getResString("post_body_mode"), // $NON-NLS-1$ + new String[]{ + JMeterUtils.getResString("post_as_parameters"), // $NON-NLS-1$ + JMeterUtils.getResString("post_as_rawbody")});// $NON-NLS-1$ + postBodyMode.addChangeListener(this); + panel.setMinimumSize(panel.getPreferredSize()); panel.add(Box.createHorizontalStrut(5)); panel.add(contentEncodingLabel); panel.add(contentEncoding); + panel.add(postBodyMode); panel.setMinimumSize(panel.getPreferredSize()); return panel; } - protected JPanel getParameterPanel() { + protected JTabbedPane getParameterPanel() { + postContentTabbedPane = new JTabbedPane(); argsPanel = new HTTPArgumentsPanel(); - - return argsPanel; + postBodyContent = new JLabeledTextArea(JMeterUtils.getResString("post_body_raw"));// $NON-NLS-1$ + postContentTabbedPane.add(JMeterUtils.getResString("post_as_parameters"), argsPanel);// $NON-NLS-1$ + postContentTabbedPane.add(JMeterUtils.getResString("post_body"), postBodyContent);// $NON-NLS-1$ + postContentTabbedPane.setEnabledAt(1, false); + return postContentTabbedPane; } // autoRedirects and followRedirects cannot both be selected @@ -522,5 +599,20 @@ autoRedirects.setSelected(false); } } + if(e.getSource() == postBodyMode) + { + if(postBodyMode.getSelectedIndex()==0) + { + postContentTabbedPane.setEnabledAt(0,true); + postContentTabbedPane.setEnabledAt(1,false); + postContentTabbedPane.setSelectedIndex(0); + } + else + { + postContentTabbedPane.setEnabledAt(0,false); + postContentTabbedPane.setEnabledAt(1,true); + postContentTabbedPane.setSelectedIndex(1); + } + } } } Index: src/core/org/apache/jmeter/resources/messages.properties =================================================================== --- src/core/org/apache/jmeter/resources/messages.properties (revision 1173604) +++ src/core/org/apache/jmeter/resources/messages.properties (working copy) @@ -1030,6 +1030,11 @@ web_server_client=Client implementation: web_server_domain=Server Name or IP\: web_server_port=Port Number\: +post_as_parameters=Parameters +post_as_rawbody=RAW Body +post_body_mode=POST Body Mode\: +post_body_raw=Raw Post Body +post_body=Post Body web_testing2_source_ip=Source IP address: web_testing2_title=HTTP Request HTTPClient web_testing_concurrent_download=Use concurrent pool. Size: