You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@jmeter.apache.org by Philippe Mouawad <ph...@gmail.com> on 2012/08/24 16:00:11 UTC

Re: svn commit: r1376902 - /jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPHC4Impl.java

On Fri, Aug 24, 2012 at 3:08 PM, <se...@apache.org> wrote:

> Author: sebb
> Date: Fri Aug 24 13:08:08 2012
> New Revision: 1376902
>
> URL: http://svn.apache.org/viewvc?rev=1376902&view=rev
> Log:
> Simplify and add Javadoc for PUT/PATCH content processing.
> TODO: the same for POST
>
> Modified:
>
> jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPHC4Impl.java
>
> 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=1376902&r1=1376901&r2=1376902&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
> Fri Aug 24 13:08:08 2012
> @@ -23,6 +23,7 @@ import java.io.File;
>  import java.io.IOException;
>  import java.io.InputStream;
>  import java.io.OutputStream;
> +import java.io.UnsupportedEncodingException;
>  import java.net.InetAddress;
>  import java.net.URI;
>  import java.net.URL;
> @@ -91,6 +92,7 @@ import org.apache.http.params.DefaultedH
>  import org.apache.http.params.HttpParams;
>  import org.apache.http.protocol.BasicHttpContext;
>  import org.apache.http.protocol.ExecutionContext;
> +import org.apache.http.protocol.HTTP;
>  import org.apache.http.protocol.HttpContext;
>  import org.apache.jmeter.protocol.http.control.AuthManager;
>  import org.apache.jmeter.protocol.http.control.Authorization;
> @@ -1007,47 +1009,48 @@ public class HTTPHC4Impl extends HTTPHCA
>
>      /**
>       * Creates the entity data to be sent.
> +     * <p>
> +     * If there is a file entry with a non-empty MIME type we use that to
> +     * set the request Content-Type header, otherwise we default to
> whatever
> +     * header is present from a Header Manager.
> +     * <p>
> +     * If the content charset {@link #getContentEncoding()} is null or
> empty
> +     * we use the HC4 default provided by {@link
> HTTP.DEF_CONTENT_CHARSET} which is
> +     * ISO-8859-1.
>       *
>       * @param entity to be processed, e.g. PUT or PATCH
>       * @return the entity content, may be empty
> -     * @throws IOException
> +     * @throws  UnsupportedEncodingException for invalid charset name
> +     * @throws IOException cannot really occur for ByteArrayOutputStream
> methods
>       */
>      private String sendEntityData( HttpEntityEnclosingRequestBase entity)
> throws IOException {
>          // Buffer to hold the entity body
>          StringBuilder entityBody = new StringBuilder(1000);
>          boolean hasEntityBody = false;
>
> -        HTTPFileArg files[] = getHTTPFiles();
> -        // Check if the header manager had a content type header
> -        // This allows the user to specify his own content-type
> -        Header contentTypeHeader =
> entity.getFirstHeader(HTTPConstants.HEADER_CONTENT_TYPE);
>
Where is this in modified code ? why is it removed ?

> -        String contentTypeValue = contentTypeHeader == null ? null :
> contentTypeHeader.getValue();
> -        if(contentTypeValue == null) {
> -            // Allow the mimetype of the file to control the content type
> -            // This is not obvious in GUI if you are not uploading any
> files,
> -            // but just sending the content of nameless parameters
> -            HTTPFileArg file = files.length > 0? files[0] : null;
> -            if(file != null && file.getMimeType() != null &&
> file.getMimeType().length() > 0) {
> -                contentTypeValue = file.getMimeType();
> -            }
> -        }
> -
> -        // Check for local contentEncoding override
> -        final String contentEncoding = getContentEncodingOrNull();
> -        final boolean haveContentEncoding = contentEncoding != null;
> -
> -        final HttpParams entityParams = entity.getParams();
> -        final String charset = getCharsetWithDefault(entityParams);
> -        final ContentType contentType =
> ContentType.create(contentTypeValue, charset);
> -
> +        final HTTPFileArg files[] = getHTTPFiles();
> +        // Allow the mimetype of the file to control the content type
> +        // This is not obvious in GUI if you are not uploading any files,
> +        // but just sending the content of nameless parameters
> +        final HTTPFileArg file = files.length > 0? files[0] : null;
> +        String contentTypeValue = null;
> +        if(file != null && file.getMimeType() != null &&
> file.getMimeType().length() > 0) {
> +            contentTypeValue = file.getMimeType();
> +            entity.setHeader(HEADER_CONTENT_TYPE, contentTypeValue); //
> we provide the MIME type here
> +        }
> +
> +        // Check for local contentEncoding (charset) override; fall back
> to default for content body
> +        // we do this here rather so we can use the same charset to
> retrieve the data
> +        final String charset = getContentEncoding(
> HTTP.DEF_CONTENT_CHARSET.name());
>
> +        // Only create this if we are overriding whatever default there
> may be
>          // If there are no arguments, we can send a file as the body of
> the request
>
>          if(!hasArguments() && getSendFileAsPostBody()) {
>              hasEntityBody = true;
>
>              // If getSendFileAsPostBody returned true, it's sure that
> file is not null
> -            FileEntity fileRequestEntity = new FileEntity(new
> File(files[0].getPath()), contentType);
> +            FileEntity fileRequestEntity = new FileEntity(new
> File(files[0].getPath())); // no need for content-type here
>              entity.setEntity(fileRequestEntity);
>          }
>          // If none of the arguments have a name specified, we
> @@ -1060,28 +1063,22 @@ public class HTTPHC4Impl extends HTTPHCA
>              PropertyIterator args = getArguments().iterator();
>              while (args.hasNext()) {
>                  HTTPArgument arg = (HTTPArgument)
> args.next().getObjectValue();
> -                String value = null;
> -                if (haveContentEncoding){
> -                    value = arg.getEncodedValue(contentEncoding);
> -                } else {
> -                    value = arg.getEncodedValue();
> -                }
> -                entityBodyContent.append(value);
> +                // Encoding is done by the StringEntity
> +                entityBodyContent.append(arg.getValue());
>
For me this changes the behaviour of method related to URL encoding.
Are you sure it's OK ?


>              }
> -            StringEntity requestEntity = new
> StringEntity(entityBodyContent.toString(), contentType);
> +            StringEntity requestEntity = new
> StringEntity(entityBodyContent.toString(), charset);
>
             entity.setEntity(requestEntity);

>          }
>          // Check if we have any content to send for body
>          if(hasEntityBody) {
>              // If the request entity is repeatable, we can send it first
> to
>              // our own stream, so we can return it
> -            if(entity.getEntity().isRepeatable()) {
> +            final HttpEntity entityEntry = entity.getEntity();
> +            if(entityEntry.isRepeatable()) {
>                  ByteArrayOutputStream bos = new ByteArrayOutputStream();
> -                entity.getEntity().writeTo(bos);
> +                entityEntry.writeTo(bos);
>                  bos.flush();
> -
>                  // We get the posted bytes using the charset that was
> used to create them
> -                // if none was set, platform encoding will be used
>                  entityBody.append(new String(bos.toByteArray(), charset));
>                  bos.close();
>              }
> @@ -1097,9 +1094,17 @@ public class HTTPHC4Impl extends HTTPHCA
>       * @return the value of {@link #getContentEncoding()}; forced to null
> if empty
>       */
>      private String getContentEncodingOrNull() {
> +        return getContentEncoding(null);
> +    }
> +
> +    /**
> +     * @param dflt the default to be used
> +     * @return the value of {@link #getContentEncoding()}; default if
> null or empty
> +     */
> +    private String getContentEncoding(String dflt) {
>          String ce = getContentEncoding();
>          if (isNullOrEmptyTrimmed(ce)) {
> -            return null;
> +            return dflt;
>          } else {
>              return ce;
>          }
>
>
>


-- 
Cordialement.
Philippe Mouawad.

Re: svn commit: r1376902 - /jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPHC4Impl.java

Posted by sebb <se...@gmail.com>.
On 24 August 2012 15:00, Philippe Mouawad <ph...@gmail.com> wrote:
> On Fri, Aug 24, 2012 at 3:08 PM, <se...@apache.org> wrote:
>
>> Author: sebb
>> Date: Fri Aug 24 13:08:08 2012
>> New Revision: 1376902
>>
>> URL: http://svn.apache.org/viewvc?rev=1376902&view=rev
>> Log:
>> Simplify and add Javadoc for PUT/PATCH content processing.
>> TODO: the same for POST
>>
>> Modified:
>>
>> jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPHC4Impl.java
>>
>> 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=1376902&r1=1376901&r2=1376902&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
>> Fri Aug 24 13:08:08 2012
>> @@ -23,6 +23,7 @@ import java.io.File;
>>  import java.io.IOException;
>>  import java.io.InputStream;
>>  import java.io.OutputStream;
>> +import java.io.UnsupportedEncodingException;
>>  import java.net.InetAddress;
>>  import java.net.URI;
>>  import java.net.URL;
>> @@ -91,6 +92,7 @@ import org.apache.http.params.DefaultedH
>>  import org.apache.http.params.HttpParams;
>>  import org.apache.http.protocol.BasicHttpContext;
>>  import org.apache.http.protocol.ExecutionContext;
>> +import org.apache.http.protocol.HTTP;
>>  import org.apache.http.protocol.HttpContext;
>>  import org.apache.jmeter.protocol.http.control.AuthManager;
>>  import org.apache.jmeter.protocol.http.control.Authorization;
>> @@ -1007,47 +1009,48 @@ public class HTTPHC4Impl extends HTTPHCA
>>
>>      /**
>>       * Creates the entity data to be sent.
>> +     * <p>
>> +     * If there is a file entry with a non-empty MIME type we use that to
>> +     * set the request Content-Type header, otherwise we default to
>> whatever
>> +     * header is present from a Header Manager.
>> +     * <p>
>> +     * If the content charset {@link #getContentEncoding()} is null or
>> empty
>> +     * we use the HC4 default provided by {@link
>> HTTP.DEF_CONTENT_CHARSET} which is
>> +     * ISO-8859-1.
>>       *
>>       * @param entity to be processed, e.g. PUT or PATCH
>>       * @return the entity content, may be empty
>> -     * @throws IOException
>> +     * @throws  UnsupportedEncodingException for invalid charset name
>> +     * @throws IOException cannot really occur for ByteArrayOutputStream
>> methods
>>       */
>>      private String sendEntityData( HttpEntityEnclosingRequestBase entity)
>> throws IOException {
>>          // Buffer to hold the entity body
>>          StringBuilder entityBody = new StringBuilder(1000);
>>          boolean hasEntityBody = false;
>>
>> -        HTTPFileArg files[] = getHTTPFiles();
>> -        // Check if the header manager had a content type header
>> -        // This allows the user to specify his own content-type
>> -        Header contentTypeHeader =
>> entity.getFirstHeader(HTTPConstants.HEADER_CONTENT_TYPE);
>>
> Where is this in modified code ?

It's not needed, as it is left alone unless overwritten by a local MIME type.

> why is it removed ?

I changed the code slightly so that settings on the GUI itself (i.e.
MIME type) will override any external settings in Header Manager.

Seems wrong to provide a local override and then not use it.

>> -        String contentTypeValue = contentTypeHeader == null ? null :
>> contentTypeHeader.getValue();
>> -        if(contentTypeValue == null) {
>> -            // Allow the mimetype of the file to control the content type
>> -            // This is not obvious in GUI if you are not uploading any
>> files,
>> -            // but just sending the content of nameless parameters
>> -            HTTPFileArg file = files.length > 0? files[0] : null;
>> -            if(file != null && file.getMimeType() != null &&
>> file.getMimeType().length() > 0) {
>> -                contentTypeValue = file.getMimeType();
>> -            }
>> -        }
>> -
>> -        // Check for local contentEncoding override
>> -        final String contentEncoding = getContentEncodingOrNull();
>> -        final boolean haveContentEncoding = contentEncoding != null;
>> -
>> -        final HttpParams entityParams = entity.getParams();
>> -        final String charset = getCharsetWithDefault(entityParams);
>> -        final ContentType contentType =
>> ContentType.create(contentTypeValue, charset);
>> -
>> +        final HTTPFileArg files[] = getHTTPFiles();
>> +        // Allow the mimetype of the file to control the content type
>> +        // This is not obvious in GUI if you are not uploading any files,
>> +        // but just sending the content of nameless parameters
>> +        final HTTPFileArg file = files.length > 0? files[0] : null;
>> +        String contentTypeValue = null;
>> +        if(file != null && file.getMimeType() != null &&
>> file.getMimeType().length() > 0) {
>> +            contentTypeValue = file.getMimeType();
>> +            entity.setHeader(HEADER_CONTENT_TYPE, contentTypeValue); //
>> we provide the MIME type here
>> +        }
>> +
>> +        // Check for local contentEncoding (charset) override; fall back
>> to default for content body
>> +        // we do this here rather so we can use the same charset to
>> retrieve the data
>> +        final String charset = getContentEncoding(
>> HTTP.DEF_CONTENT_CHARSET.name());
>>
>> +        // Only create this if we are overriding whatever default there
>> may be
>>          // If there are no arguments, we can send a file as the body of
>> the request
>>
>>          if(!hasArguments() && getSendFileAsPostBody()) {
>>              hasEntityBody = true;
>>
>>              // If getSendFileAsPostBody returned true, it's sure that
>> file is not null
>> -            FileEntity fileRequestEntity = new FileEntity(new
>> File(files[0].getPath()), contentType);
>> +            FileEntity fileRequestEntity = new FileEntity(new
>> File(files[0].getPath())); // no need for content-type here
>>              entity.setEntity(fileRequestEntity);
>>          }
>>          // If none of the arguments have a name specified, we
>> @@ -1060,28 +1063,22 @@ public class HTTPHC4Impl extends HTTPHCA
>>              PropertyIterator args = getArguments().iterator();
>>              while (args.hasNext()) {
>>                  HTTPArgument arg = (HTTPArgument)
>> args.next().getObjectValue();
>> -                String value = null;
>> -                if (haveContentEncoding){
>> -                    value = arg.getEncodedValue(contentEncoding);
>> -                } else {
>> -                    value = arg.getEncodedValue();
>> -                }
>> -                entityBodyContent.append(value);
>> +                // Encoding is done by the StringEntity
>> +                entityBodyContent.append(arg.getValue());
>>
> For me this changes the behaviour of method related to URL encoding.
> Are you sure it's OK ?
>
>
>>              }
>> -            StringEntity requestEntity = new
>> StringEntity(entityBodyContent.toString(), contentType);
>> +            StringEntity requestEntity = new
>> StringEntity(entityBodyContent.toString(), charset);
>>
>              entity.setEntity(requestEntity);
>
>>          }
>>          // Check if we have any content to send for body
>>          if(hasEntityBody) {
>>              // If the request entity is repeatable, we can send it first
>> to
>>              // our own stream, so we can return it
>> -            if(entity.getEntity().isRepeatable()) {
>> +            final HttpEntity entityEntry = entity.getEntity();
>> +            if(entityEntry.isRepeatable()) {
>>                  ByteArrayOutputStream bos = new ByteArrayOutputStream();
>> -                entity.getEntity().writeTo(bos);
>> +                entityEntry.writeTo(bos);
>>                  bos.flush();
>> -
>>                  // We get the posted bytes using the charset that was
>> used to create them
>> -                // if none was set, platform encoding will be used
>>                  entityBody.append(new String(bos.toByteArray(), charset));
>>                  bos.close();
>>              }
>> @@ -1097,9 +1094,17 @@ public class HTTPHC4Impl extends HTTPHCA
>>       * @return the value of {@link #getContentEncoding()}; forced to null
>> if empty
>>       */
>>      private String getContentEncodingOrNull() {
>> +        return getContentEncoding(null);
>> +    }
>> +
>> +    /**
>> +     * @param dflt the default to be used
>> +     * @return the value of {@link #getContentEncoding()}; default if
>> null or empty
>> +     */
>> +    private String getContentEncoding(String dflt) {
>>          String ce = getContentEncoding();
>>          if (isNullOrEmptyTrimmed(ce)) {
>> -            return null;
>> +            return dflt;
>>          } else {
>>              return ce;
>>          }
>>
>>
>>
>
>
> --
> Cordialement.
> Philippe Mouawad.