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.