Hi Felix,
Sorry for not answering , didn't have time to look at it.

Regarding this commit, what about HttpJavaImpl and HC3 ?

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.

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

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.

Reply via email to