On 24 August 2012 15:00, Philippe Mouawad <[email protected]> wrote:
> On Fri, Aug 24, 2012 at 3:08 PM, <[email protected]> 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.

Reply via email to