Ho Felix, My answers below.
On Monday, March 7, 2016, Felix Schumacher < [email protected]> wrote: > Am 03.03.2016 um 22:05 schrieb Philippe Mouawad: > >> Hi Felix, >> Sorry for not answering , didn't have time to look at it. >> > Sorry for my late reply :) > >> Regarding this commit, what about HttpJavaImpl and HC3 ? >> > HC3 seems easy to add. I think I will give it a try. Java seems to be out > of game, if I read the javadoc correctly. We deprecate it in this release do you think it is still useful to enhance it ? > > >> Looking into code, it appears anyway Java does not handle Webdav, nor >> patch. I am also not sure about methods different from POST/GET/PUT. >> > > https://docs.oracle.com/javase/7/docs/api/java/net/HttpURLConnection.html#setRequestMethod%28java.lang.String%29 > says GET, POST, HEAD, OPTIONS, PUT, DELETE, TRACE are valid methods. I > will change our documentation to reflect these values. but does our implementation really works fine with all these ? > >> Do you think we should make select box depend on chosen implementation ? >> knowing it can be: >> - In HTTP Requrest : Easy to test >> - A property : Easy to test >> - HTTP Request Default : More difficult >> > I don't think it should be handled differently. Did you also see my proposal to deprecate Java impl ? > > Regards, > Felix > > >> For HC3, as we deprecate it it's ok for me. >> >> Should we also deprecate JavaImpl ? >> >> Regards >> >> >> >> On Thu, Mar 3, 2016 at 9:55 PM, <[email protected]> wrote: >> >> Author: fschumacher >>> Date: Thu Mar 3 20:55:33 2016 >>> New Revision: 1733521 >>> >>> URL: http://svn.apache.org/viewvc?rev=1733521&view=rev >>> Log: >>> HTTP Request : Make Method field editable so that additional methods >>> (Webdav) can be added easily >>> >>> Bugzilla Id: 59083 >>> >>> Modified: >>> jmeter/trunk/bin/jmeter.properties >>> >>> >>> jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/config/gui/UrlConfigGui.java >>> >>> >>> jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPHC4Impl.java >>> >>> >>> jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSampleResult.java >>> >>> >>> jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSamplerBase.java >>> >>> >>> jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HttpWebdav.java >>> 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=1733521&r1=1733520&r2=1733521&view=diff >>> >>> >>> ============================================================================== >>> --- jmeter/trunk/bin/jmeter.properties (original) >>> +++ jmeter/trunk/bin/jmeter.properties Thu Mar 3 20:55:33 2016 >>> @@ -987,6 +987,9 @@ beanshell.server.file=../extras/startup. >>> # default to false >>> #httpsampler.embedded_resources_use_md5=false >>> >>> +# List of extra HTTP methods that should be available in select box >>> >>> >>> +#httpsampler.user_defined_methods=VERSION-CONTROL,REPORT,CHECKOUT,CHECKIN,UNCHECKOUT,MKWORKSPACE,UPDATE,LABEL,MERGE,BASELINE-CONTROL,MKACTIVITY >>> + >>> # The encoding to be used if none is provided (default ISO-8859-1) >>> #sampleresult.default.encoding=ISO-8859-1 >>> >>> >>> Modified: >>> >>> jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/config/gui/UrlConfigGui.java >>> URL: >>> >>> http://svn.apache.org/viewvc/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/config/gui/UrlConfigGui.java?rev=1733521&r1=1733520&r2=1733521&view=diff >>> >>> >>> ============================================================================== >>> --- >>> >>> jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/config/gui/UrlConfigGui.java >>> (original) >>> +++ >>> >>> jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/config/gui/UrlConfigGui.java >>> Thu Mar 3 20:55:33 2016 >>> @@ -627,7 +627,7 @@ public class UrlConfigGui extends JPanel >>> >>> if (notConfigOnly){ >>> method = new >>> JLabeledChoice(JMeterUtils.getResString("method"), // $NON-NLS-1$ >>> - HTTPSamplerBase.getValidMethodsAsArray()); >>> + HTTPSamplerBase.getValidMethodsAsArray(), true); >>> method.addChangeListener(this); >>> } >>> >>> >>> Modified: >>> >>> jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPHC4Impl.java >>> URL: >>> >>> http://svn.apache.org/viewvc/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPHC4Impl.java?rev=1733521&r1=1733520&r2=1733521&view=diff >>> >>> >>> ============================================================================== >>> --- >>> >>> jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPHC4Impl.java >>> (original) >>> +++ >>> >>> jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPHC4Impl.java >>> Thu Mar 3 20:55:33 2016 >>> @@ -487,13 +487,11 @@ public class HTTPHC4Impl extends HTTPHCA >>> protected void handleMethod(String method, HTTPSampleResult result, >>> HttpRequestBase httpRequest, HttpContext localContext) >>> throws >>> IOException { >>> // Handle the various methods >>> - if (method.equals(HTTPConstants.POST)) { >>> + if (httpRequest instanceof HttpPost) { >>> String postBody = sendPostData((HttpPost)httpRequest); >>> result.setQueryString(postBody); >>> - } else if (method.equals(HTTPConstants.PUT) || >>> method.equals(HTTPConstants.PATCH) >>> - || HttpWebdav.isWebdavMethod(method) >>> - || method.equals(HTTPConstants.DELETE)) { >>> - String entityBody = sendEntityData(( >>> HttpEntityEnclosingRequestBase)httpRequest); >>> + } else if (httpRequest instanceof >>> HttpEntityEnclosingRequestBase) >>> { >>> + String entityBody = >>> sendEntityData((HttpEntityEnclosingRequestBase) httpRequest); >>> result.setQueryString(entityBody); >>> } >>> } >>> >>> Modified: >>> >>> jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSampleResult.java >>> URL: >>> >>> http://svn.apache.org/viewvc/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSampleResult.java?rev=1733521&r1=1733520&r2=1733521&view=diff >>> >>> >>> ============================================================================== >>> --- >>> >>> jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSampleResult.java >>> (original) >>> +++ >>> >>> jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSampleResult.java >>> Thu Mar 3 20:55:33 2016 >>> @@ -22,7 +22,10 @@ import java.net.HttpURLConnection; >>> import java.net.URL; >>> import java.nio.charset.Charset; >>> import java.util.ArrayList; >>> +import java.util.Arrays; >>> +import java.util.HashSet; >>> import java.util.List; >>> +import java.util.Set; >>> >>> import org.apache.jmeter.protocol.http.util.HTTPConstants; >>> import org.apache.jmeter.samplers.SampleResult; >>> @@ -35,6 +38,12 @@ public class HTTPSampleResult extends Sa >>> >>> private static final long serialVersionUID = 240L; >>> >>> + /** Set of all HTTP methods, that have no body */ >>> + private static final Set<String> METHODS_WITHOUT_BODY = new >>> HashSet<>( >>> + Arrays.asList(HTTPConstants.GET, HTTPConstants.HEAD, >>> + HTTPConstants.OPTIONS, HTTPConstants.DELETE, >>> + HTTPConstants.TRACE)); >>> + >>> private String cookies = ""; // never null >>> >>> private String method; >>> @@ -138,10 +147,7 @@ public class HTTPSampleResult extends Sa >>> sb.append(u.toString()); >>> sb.append("\n"); >>> // Include request body if it is a post or put or patch >>> - if (HTTPConstants.POST.equals(method) || >>> HTTPConstants.PUT.equals(method) >>> - || HTTPConstants.PATCH.equals(method) >>> - || HttpWebdav.isWebdavMethod(method) >>> - || HTTPConstants.DELETE.equals(method)) { >>> + if (!METHODS_WITHOUT_BODY.contains(method)) { >>> sb.append("\n"+method+" data:\n"); >>> sb.append(queryString); >>> sb.append("\n"); >>> >>> Modified: >>> >>> jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSamplerBase.java >>> URL: >>> >>> http://svn.apache.org/viewvc/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSamplerBase.java?rev=1733521&r1=1733520&r2=1733521&view=diff >>> >>> >>> ============================================================================== >>> --- >>> >>> jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSamplerBase.java >>> (original) >>> +++ >>> >>> jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSamplerBase.java >>> Thu Mar 3 20:55:33 2016 >>> @@ -226,29 +226,36 @@ public abstract class HTTPSamplerBase ex >>> } >>> >>> public static final String DEFAULT_METHOD = HTTPConstants.GET; // >>> $NON-NLS-1$ >>> - // Supported methods: >>> - private static final String [] METHODS = { >>> - DEFAULT_METHOD, // i.e. GET >>> - HTTPConstants.POST, >>> - HTTPConstants.HEAD, >>> - HTTPConstants.PUT, >>> - HTTPConstants.OPTIONS, >>> - HTTPConstants.TRACE, >>> - HTTPConstants.DELETE, >>> - HTTPConstants.PATCH, >>> - HTTPConstants.PROPFIND, >>> - HTTPConstants.PROPPATCH, >>> - HTTPConstants.MKCOL, >>> - HTTPConstants.COPY, >>> - HTTPConstants.MOVE, >>> - HTTPConstants.LOCK, >>> - HTTPConstants.UNLOCK, >>> - HTTPConstants.REPORT, >>> - HTTPConstants.MKCALENDAR, >>> - HTTPConstants.SEARCH >>> - }; >>> >>> - private static final List<String> METHODLIST = >>> Collections.unmodifiableList(Arrays.asList(METHODS)); >>> + private static final List<String> METHODLIST; >>> + static { >>> + List<String> defaultMethods = new ArrayList<>(Arrays.asList( >>> + DEFAULT_METHOD, // i.e. GET >>> + HTTPConstants.POST, >>> + HTTPConstants.HEAD, >>> + HTTPConstants.PUT, >>> + HTTPConstants.OPTIONS, >>> + HTTPConstants.TRACE, >>> + HTTPConstants.DELETE, >>> + HTTPConstants.PATCH, >>> + HTTPConstants.PROPFIND, >>> + HTTPConstants.PROPPATCH, >>> + HTTPConstants.MKCOL, >>> + HTTPConstants.COPY, >>> + HTTPConstants.MOVE, >>> + HTTPConstants.LOCK, >>> + HTTPConstants.UNLOCK, >>> + HTTPConstants.REPORT, >>> + HTTPConstants.MKCALENDAR, >>> + HTTPConstants.SEARCH >>> + )); >>> + String userDefinedMethods = JMeterUtils.getPropDefault( >>> + "httpsampler.user_defined_methods", ""); >>> + if (StringUtils.isNotBlank(userDefinedMethods)) { >>> + >>> >>> defaultMethods.addAll(Arrays.asList(userDefinedMethods.split("\\s*,\\s*"))); >>> + } >>> + METHODLIST = Collections.unmodifiableList(defaultMethods); >>> + } >>> >>> // @see mergeFileProperties >>> // Must be private, as the file list needs special handling >>> >>> Modified: >>> >>> jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HttpWebdav.java >>> URL: >>> >>> http://svn.apache.org/viewvc/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HttpWebdav.java?rev=1733521&r1=1733520&r2=1733521&view=diff >>> >>> >>> ============================================================================== >>> --- >>> >>> jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HttpWebdav.java >>> (original) >>> +++ >>> >>> jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HttpWebdav.java >>> Thu Mar 3 20:55:33 2016 >>> @@ -19,38 +19,25 @@ >>> package org.apache.jmeter.protocol.http.sampler; >>> >>> import java.net.URI; >>> -import java.util.Arrays; >>> -import java.util.HashSet; >>> -import java.util.Set; >>> >>> import org.apache.http.client.methods.HttpEntityEnclosingRequestBase; >>> -import org.apache.jmeter.protocol.http.util.HTTPConstants; >>> >>> /** >>> * WebDav request >>> + * >>> * @since 2.12 >>> */ >>> public final class HttpWebdav extends HttpEntityEnclosingRequestBase { >>> - private static final Set<String> WEBDAV_METHODS = >>> - new HashSet<>(Arrays.asList( >>> - HTTPConstants.PROPFIND, >>> - HTTPConstants.PROPPATCH, >>> - HTTPConstants.MKCOL, >>> - HTTPConstants.COPY, >>> - HTTPConstants.MOVE, >>> - HTTPConstants.LOCK, >>> - HTTPConstants.UNLOCK, >>> - HTTPConstants.REPORT, >>> - HTTPConstants.MKCALENDAR, >>> - HTTPConstants.SEARCH >>> - )); >>> - >>> - private String davMethod; >>> + >>> + private final String davMethod; >>> >>> /** >>> * >>> - * @param davMethod method to use (has to be a Webdav method as >>> identified by {@link #isWebdavMethod(String)}) >>> - * @param uri {@link URI} to use >>> + * @param davMethod >>> + * method to use (has to be a Webdav method as identified >>> by >>> + * {@link #isWebdavMethod(String)}) >>> + * @param uri >>> + * {@link URI} to use >>> */ >>> public HttpWebdav(final String davMethod, final URI uri) { >>> super(); >>> @@ -64,10 +51,13 @@ public final class HttpWebdav extends Ht >>> } >>> >>> /** >>> - * @param method Http Method >>> + * @param method >>> + * Http Method >>> * @return <code>true</code> if method is a Webdav one >>> */ >>> public static boolean isWebdavMethod(String method) { >>> - return WEBDAV_METHODS.contains(method); >>> + // A HTTP method can be a token as specified in >>> + // https://tools.ietf.org/html/rfc7230#section-3.2.6 >>> + return method != null && >>> method.matches("^(?i)[\\da-z!#$%&'*+\\-.^_`|~]+$"); >>> } >>> } >>> >>> Modified: jmeter/trunk/xdocs/usermanual/component_reference.xml >>> URL: >>> >>> http://svn.apache.org/viewvc/jmeter/trunk/xdocs/usermanual/component_reference.xml?rev=1733521&r1=1733520&r2=1733521&view=diff >>> >>> >>> ============================================================================== >>> --- jmeter/trunk/xdocs/usermanual/component_reference.xml (original) >>> +++ jmeter/trunk/xdocs/usermanual/component_reference.xml Thu Mar 3 >>> 20:55:33 2016 >>> @@ -232,7 +232,10 @@ https.default.protocol=SSLv3 >>> <code>JAVA</code> implementation). With >>> <code>HttpClient4</code>, the following methods related to WebDav are >>> also allowed: <code>COPY</code>, <code>LOCK</code>, >>> <code>MKCOL</code>, <code>MOVE</code>, >>> <code>PROPFIND</code>, <code>PROPPATCH</code>, >>> <code>UNLOCK</code>, <code>REPORT</code>, <code>MKCALENDAR</code>, >>> - <code>SEARCH</code>.</property> >>> + <code>SEARCH</code>. >>> + <p>More methods can be pre-defined for the HttpClient4 by >>> using >>> the JMeter property >>> + <code>httpsampler.user_defined_methods</code>.</p> >>> + </property> >>> <property name="Content Encoding" required="No"> >>> Content encoding to be used (for <code>POST</code>, >>> <code>PUT</code>, <code>PATCH</code> and <code>FILE</code>). >>> This is the character encoding to be used, and is not related >>> to >>> the Content-Encoding HTTP header. >>> >>> >>> >>> >> > -- Cordialement. Philippe Mouawad.
