You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@jakarta.apache.org by se...@apache.org on 2010/12/07 14:26:08 UTC
svn commit: r1043037 -
/jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPHC3Impl.java
Author: sebb
Date: Tue Dec 7 13:26:08 2010
New Revision: 1043037
URL: http://svn.apache.org/viewvc?rev=1043037&view=rev
Log:
Re-order methods slightly
Modified:
jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPHC3Impl.java
Modified: jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPHC3Impl.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPHC3Impl.java?rev=1043037&r1=1043036&r2=1043037&view=diff
==============================================================================
--- jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPHC3Impl.java (original)
+++ jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPHC3Impl.java Tue Dec 7 13:26:08 2010
@@ -160,241 +160,6 @@ public class HTTPHC3Impl extends HTTPHCA
super(base);
}
- /*
- * Send POST data from <code>Entry</code> to the open connection.
- *
- * @param connection
- * <code>URLConnection</code> where POST data should be sent
- * @return a String show what was posted. Will not contain actual file upload content
- * @exception IOException
- * if an I/O exception occurs
- */
- private String sendPostData(PostMethod post) throws IOException {
- // Buffer to hold the post body, except file content
- StringBuilder postedBody = new StringBuilder(1000);
- HTTPFileArg files[] = getHTTPFiles();
- // Check if we should do a multipart/form-data or an
- // application/x-www-form-urlencoded post request
- if(getUseMultipartForPost()) {
- // If a content encoding is specified, we use that as the
- // encoding of any parameter values
- String contentEncoding = getContentEncoding();
- if(contentEncoding != null && contentEncoding.length() == 0) {
- contentEncoding = null;
- }
-
- // We don't know how many entries will be skipped
- ArrayList<PartBase> partlist = new ArrayList<PartBase>();
- // Create the parts
- // Add any parameters
- PropertyIterator args = getArguments().iterator();
- while (args.hasNext()) {
- HTTPArgument arg = (HTTPArgument) args.next().getObjectValue();
- String parameterName = arg.getName();
- if (arg.isSkippable(parameterName)){
- continue;
- }
- partlist.add(new StringPart(arg.getName(), arg.getValue(), contentEncoding));
- }
-
- // Add any files
- for (int i=0; i < files.length; i++) {
- HTTPFileArg file = files[i];
- File inputFile = new File(file.getPath());
- // We do not know the char set of the file to be uploaded, so we set it to null
- ViewableFilePart filePart = new ViewableFilePart(file.getParamName(), inputFile, file.getMimeType(), null);
- filePart.setCharSet(null); // We do not know what the char set of the file is
- partlist.add(filePart);
- }
-
- // Set the multipart for the post
- int partNo = partlist.size();
- Part[] parts = partlist.toArray(new Part[partNo]);
- MultipartRequestEntity multiPart = new MultipartRequestEntity(parts, post.getParams());
- post.setRequestEntity(multiPart);
-
- // Set the content type
- String multiPartContentType = multiPart.getContentType();
- post.setRequestHeader(HEADER_CONTENT_TYPE, multiPartContentType);
-
- // If the Multipart is repeatable, we can send it first to
- // our own stream, without the actual file content, so we can return it
- if(multiPart.isRepeatable()) {
- // For all the file multiparts, we must tell it to not include
- // the actual file content
- for(int i = 0; i < partNo; i++) {
- if(parts[i] instanceof ViewableFilePart) {
- ((ViewableFilePart) parts[i]).setHideFileData(true); // .sendMultipartWithoutFileContent(bos);
- }
- }
- // Write the request to our own stream
- ByteArrayOutputStream bos = new ByteArrayOutputStream();
- multiPart.writeRequest(bos);
- bos.flush();
- // We get the posted bytes using the encoding used to create it
- postedBody.append(new String(bos.toByteArray(),
- contentEncoding == null ? "US-ASCII" // $NON-NLS-1$ this is the default used by HttpClient
- : contentEncoding));
- bos.close();
-
- // For all the file multiparts, we must revert the hiding of
- // the actual file content
- for(int i = 0; i < partNo; i++) {
- if(parts[i] instanceof ViewableFilePart) {
- ((ViewableFilePart) parts[i]).setHideFileData(false);
- }
- }
- }
- else {
- postedBody.append("<Multipart was not repeatable, cannot view what was sent>"); // $NON-NLS-1$
- }
- }
- else {
- // Check if the header manager had a content type header
- // This allows the user to specify his own content-type for a POST request
- Header contentTypeHeader = post.getRequestHeader(HEADER_CONTENT_TYPE);
- boolean hasContentTypeHeader = contentTypeHeader != null && contentTypeHeader.getValue() != null && contentTypeHeader.getValue().length() > 0;
- // If there are no arguments, we can send a file as the body of the request
- // TODO: needs a multiple file upload scenerio
- if(!hasArguments() && getSendFileAsPostBody()) {
- // If getSendFileAsPostBody returned true, it's sure that file is not null
- HTTPFileArg file = files[0];
- if(!hasContentTypeHeader) {
- // Allow the mimetype of the file to control the content type
- if(file.getMimeType() != null && file.getMimeType().length() > 0) {
- post.setRequestHeader(HEADER_CONTENT_TYPE, file.getMimeType());
- }
- else {
- post.setRequestHeader(HEADER_CONTENT_TYPE, APPLICATION_X_WWW_FORM_URLENCODED);
- }
- }
-
- FileRequestEntity fileRequestEntity = new FileRequestEntity(new File(file.getPath()),null);
- post.setRequestEntity(fileRequestEntity);
-
- // We just add placeholder text for file content
- postedBody.append("<actual file content, not shown here>");
- }
- else {
- // In a post request which is not multipart, we only support
- // parameters, no file upload is allowed
-
- // If a content encoding is specified, we set it as http parameter, so that
- // the post body will be encoded in the specified content encoding
- String contentEncoding = getContentEncoding();
- boolean haveContentEncoding = false;
- if(contentEncoding != null && contentEncoding.trim().length() > 0) {
- post.getParams().setContentCharset(contentEncoding);
- haveContentEncoding = true;
- } else if (contentEncoding != null && contentEncoding.trim().length() == 0){
- contentEncoding=null;
- }
-
- // If none of the arguments have a name specified, we
- // just send all the values as the post body
- if(getSendParameterValuesAsPostBody()) {
- // 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
- // TODO: needs a multiple file upload scenerio
- if(!hasContentTypeHeader) {
- HTTPFileArg file = files.length > 0? files[0] : null;
- if(file != null && file.getMimeType() != null && file.getMimeType().length() > 0) {
- post.setRequestHeader(HEADER_CONTENT_TYPE, file.getMimeType());
- }
- else {
- // TODO - is this the correct default?
- post.setRequestHeader(HEADER_CONTENT_TYPE, APPLICATION_X_WWW_FORM_URLENCODED);
- }
- }
-
- // Just append all the parameter values, and use that as the post body
- StringBuilder postBody = new StringBuilder();
- PropertyIterator args = getArguments().iterator();
- while (args.hasNext()) {
- HTTPArgument arg = (HTTPArgument) args.next().getObjectValue();
- String value;
- if (haveContentEncoding){
- value = arg.getEncodedValue(contentEncoding);
- } else {
- value = arg.getEncodedValue();
- }
- postBody.append(value);
- }
- StringRequestEntity requestEntity = new StringRequestEntity(postBody.toString(), post.getRequestHeader(HEADER_CONTENT_TYPE).getValue(), contentEncoding);
- post.setRequestEntity(requestEntity);
- }
- else {
- // It is a normal post request, with parameter names and values
-
- // Set the content type
- if(!hasContentTypeHeader) {
- post.setRequestHeader(HEADER_CONTENT_TYPE, APPLICATION_X_WWW_FORM_URLENCODED);
- }
- // Add the parameters
- PropertyIterator args = getArguments().iterator();
- while (args.hasNext()) {
- HTTPArgument arg = (HTTPArgument) args.next().getObjectValue();
- // The HTTPClient always urlencodes both name and value,
- // so if the argument is already encoded, we have to decode
- // it before adding it to the post request
- String parameterName = arg.getName();
- if (arg.isSkippable(parameterName)){
- continue;
- }
- String parameterValue = arg.getValue();
- if(!arg.isAlwaysEncoded()) {
- // The value is already encoded by the user
- // Must decode the value now, so that when the
- // httpclient encodes it, we end up with the same value
- // as the user had entered.
- String urlContentEncoding = contentEncoding;
- if(urlContentEncoding == null || urlContentEncoding.length() == 0) {
- // Use the default encoding for urls
- urlContentEncoding = EncoderCache.URL_ARGUMENT_ENCODING;
- }
- parameterName = URLDecoder.decode(parameterName, urlContentEncoding);
- parameterValue = URLDecoder.decode(parameterValue, urlContentEncoding);
- }
- // Add the parameter, httpclient will urlencode it
- post.addParameter(parameterName, parameterValue);
- }
-
-/*
-// // Alternative implementation, to make sure that HTTPSampler and HTTPSampler2
-// // sends the same post body.
-//
-// // Only include the content char set in the content-type header if it is not
-// // an APPLICATION_X_WWW_FORM_URLENCODED content type
-// String contentCharSet = null;
-// if(!post.getRequestHeader(HEADER_CONTENT_TYPE).getValue().equals(APPLICATION_X_WWW_FORM_URLENCODED)) {
-// contentCharSet = post.getRequestCharSet();
-// }
-// StringRequestEntity requestEntity = new StringRequestEntity(getQueryString(contentEncoding), post.getRequestHeader(HEADER_CONTENT_TYPE).getValue(), contentCharSet);
-// post.setRequestEntity(requestEntity);
-*/
- }
-
- // If the request entity is repeatable, we can send it first to
- // our own stream, so we can return it
- if(post.getRequestEntity().isRepeatable()) {
- ByteArrayOutputStream bos = new ByteArrayOutputStream();
- post.getRequestEntity().writeRequest(bos);
- bos.flush();
- // We get the posted bytes using the encoding used to create it
- postedBody.append(new String(bos.toByteArray(),post.getRequestCharSet()));
- bos.close();
- }
- else {
- postedBody.append("<RequestEntity was not repeatable, cannot view what was sent>");
- }
- }
- }
- // Set the content length
- post.setRequestHeader(HEADER_CONTENT_LENGTH, Long.toString(post.getRequestEntity().getContentLength()));
-
- return postedBody.toString();
- }
/**
* Returns an <code>HttpConnection</code> fully ready to attempt
@@ -893,6 +658,242 @@ public class HTTPHC3Impl extends HTTPHCA
}
}
+ /*
+ * Send POST data from <code>Entry</code> to the open connection.
+ *
+ * @param connection
+ * <code>URLConnection</code> where POST data should be sent
+ * @return a String show what was posted. Will not contain actual file upload content
+ * @exception IOException
+ * if an I/O exception occurs
+ */
+ private String sendPostData(PostMethod post) throws IOException {
+ // Buffer to hold the post body, except file content
+ StringBuilder postedBody = new StringBuilder(1000);
+ HTTPFileArg files[] = getHTTPFiles();
+ // Check if we should do a multipart/form-data or an
+ // application/x-www-form-urlencoded post request
+ if(getUseMultipartForPost()) {
+ // If a content encoding is specified, we use that as the
+ // encoding of any parameter values
+ String contentEncoding = getContentEncoding();
+ if(contentEncoding != null && contentEncoding.length() == 0) {
+ contentEncoding = null;
+ }
+
+ // We don't know how many entries will be skipped
+ ArrayList<PartBase> partlist = new ArrayList<PartBase>();
+ // Create the parts
+ // Add any parameters
+ PropertyIterator args = getArguments().iterator();
+ while (args.hasNext()) {
+ HTTPArgument arg = (HTTPArgument) args.next().getObjectValue();
+ String parameterName = arg.getName();
+ if (arg.isSkippable(parameterName)){
+ continue;
+ }
+ partlist.add(new StringPart(arg.getName(), arg.getValue(), contentEncoding));
+ }
+
+ // Add any files
+ for (int i=0; i < files.length; i++) {
+ HTTPFileArg file = files[i];
+ File inputFile = new File(file.getPath());
+ // We do not know the char set of the file to be uploaded, so we set it to null
+ ViewableFilePart filePart = new ViewableFilePart(file.getParamName(), inputFile, file.getMimeType(), null);
+ filePart.setCharSet(null); // We do not know what the char set of the file is
+ partlist.add(filePart);
+ }
+
+ // Set the multipart for the post
+ int partNo = partlist.size();
+ Part[] parts = partlist.toArray(new Part[partNo]);
+ MultipartRequestEntity multiPart = new MultipartRequestEntity(parts, post.getParams());
+ post.setRequestEntity(multiPart);
+
+ // Set the content type
+ String multiPartContentType = multiPart.getContentType();
+ post.setRequestHeader(HEADER_CONTENT_TYPE, multiPartContentType);
+
+ // If the Multipart is repeatable, we can send it first to
+ // our own stream, without the actual file content, so we can return it
+ if(multiPart.isRepeatable()) {
+ // For all the file multiparts, we must tell it to not include
+ // the actual file content
+ for(int i = 0; i < partNo; i++) {
+ if(parts[i] instanceof ViewableFilePart) {
+ ((ViewableFilePart) parts[i]).setHideFileData(true); // .sendMultipartWithoutFileContent(bos);
+ }
+ }
+ // Write the request to our own stream
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ multiPart.writeRequest(bos);
+ bos.flush();
+ // We get the posted bytes using the encoding used to create it
+ postedBody.append(new String(bos.toByteArray(),
+ contentEncoding == null ? "US-ASCII" // $NON-NLS-1$ this is the default used by HttpClient
+ : contentEncoding));
+ bos.close();
+
+ // For all the file multiparts, we must revert the hiding of
+ // the actual file content
+ for(int i = 0; i < partNo; i++) {
+ if(parts[i] instanceof ViewableFilePart) {
+ ((ViewableFilePart) parts[i]).setHideFileData(false);
+ }
+ }
+ }
+ else {
+ postedBody.append("<Multipart was not repeatable, cannot view what was sent>"); // $NON-NLS-1$
+ }
+ }
+ else {
+ // Check if the header manager had a content type header
+ // This allows the user to specify his own content-type for a POST request
+ Header contentTypeHeader = post.getRequestHeader(HEADER_CONTENT_TYPE);
+ boolean hasContentTypeHeader = contentTypeHeader != null && contentTypeHeader.getValue() != null && contentTypeHeader.getValue().length() > 0;
+ // If there are no arguments, we can send a file as the body of the request
+ // TODO: needs a multiple file upload scenerio
+ if(!hasArguments() && getSendFileAsPostBody()) {
+ // If getSendFileAsPostBody returned true, it's sure that file is not null
+ HTTPFileArg file = files[0];
+ if(!hasContentTypeHeader) {
+ // Allow the mimetype of the file to control the content type
+ if(file.getMimeType() != null && file.getMimeType().length() > 0) {
+ post.setRequestHeader(HEADER_CONTENT_TYPE, file.getMimeType());
+ }
+ else {
+ post.setRequestHeader(HEADER_CONTENT_TYPE, APPLICATION_X_WWW_FORM_URLENCODED);
+ }
+ }
+
+ FileRequestEntity fileRequestEntity = new FileRequestEntity(new File(file.getPath()),null);
+ post.setRequestEntity(fileRequestEntity);
+
+ // We just add placeholder text for file content
+ postedBody.append("<actual file content, not shown here>");
+ }
+ else {
+ // In a post request which is not multipart, we only support
+ // parameters, no file upload is allowed
+
+ // If a content encoding is specified, we set it as http parameter, so that
+ // the post body will be encoded in the specified content encoding
+ String contentEncoding = getContentEncoding();
+ boolean haveContentEncoding = false;
+ if(contentEncoding != null && contentEncoding.trim().length() > 0) {
+ post.getParams().setContentCharset(contentEncoding);
+ haveContentEncoding = true;
+ } else if (contentEncoding != null && contentEncoding.trim().length() == 0){
+ contentEncoding=null;
+ }
+
+ // If none of the arguments have a name specified, we
+ // just send all the values as the post body
+ if(getSendParameterValuesAsPostBody()) {
+ // 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
+ // TODO: needs a multiple file upload scenerio
+ if(!hasContentTypeHeader) {
+ HTTPFileArg file = files.length > 0? files[0] : null;
+ if(file != null && file.getMimeType() != null && file.getMimeType().length() > 0) {
+ post.setRequestHeader(HEADER_CONTENT_TYPE, file.getMimeType());
+ }
+ else {
+ // TODO - is this the correct default?
+ post.setRequestHeader(HEADER_CONTENT_TYPE, APPLICATION_X_WWW_FORM_URLENCODED);
+ }
+ }
+
+ // Just append all the parameter values, and use that as the post body
+ StringBuilder postBody = new StringBuilder();
+ PropertyIterator args = getArguments().iterator();
+ while (args.hasNext()) {
+ HTTPArgument arg = (HTTPArgument) args.next().getObjectValue();
+ String value;
+ if (haveContentEncoding){
+ value = arg.getEncodedValue(contentEncoding);
+ } else {
+ value = arg.getEncodedValue();
+ }
+ postBody.append(value);
+ }
+ StringRequestEntity requestEntity = new StringRequestEntity(postBody.toString(), post.getRequestHeader(HEADER_CONTENT_TYPE).getValue(), contentEncoding);
+ post.setRequestEntity(requestEntity);
+ }
+ else {
+ // It is a normal post request, with parameter names and values
+
+ // Set the content type
+ if(!hasContentTypeHeader) {
+ post.setRequestHeader(HEADER_CONTENT_TYPE, APPLICATION_X_WWW_FORM_URLENCODED);
+ }
+ // Add the parameters
+ PropertyIterator args = getArguments().iterator();
+ while (args.hasNext()) {
+ HTTPArgument arg = (HTTPArgument) args.next().getObjectValue();
+ // The HTTPClient always urlencodes both name and value,
+ // so if the argument is already encoded, we have to decode
+ // it before adding it to the post request
+ String parameterName = arg.getName();
+ if (arg.isSkippable(parameterName)){
+ continue;
+ }
+ String parameterValue = arg.getValue();
+ if(!arg.isAlwaysEncoded()) {
+ // The value is already encoded by the user
+ // Must decode the value now, so that when the
+ // httpclient encodes it, we end up with the same value
+ // as the user had entered.
+ String urlContentEncoding = contentEncoding;
+ if(urlContentEncoding == null || urlContentEncoding.length() == 0) {
+ // Use the default encoding for urls
+ urlContentEncoding = EncoderCache.URL_ARGUMENT_ENCODING;
+ }
+ parameterName = URLDecoder.decode(parameterName, urlContentEncoding);
+ parameterValue = URLDecoder.decode(parameterValue, urlContentEncoding);
+ }
+ // Add the parameter, httpclient will urlencode it
+ post.addParameter(parameterName, parameterValue);
+ }
+
+/*
+// // Alternative implementation, to make sure that HTTPSampler and HTTPSampler2
+// // sends the same post body.
+//
+// // Only include the content char set in the content-type header if it is not
+// // an APPLICATION_X_WWW_FORM_URLENCODED content type
+// String contentCharSet = null;
+// if(!post.getRequestHeader(HEADER_CONTENT_TYPE).getValue().equals(APPLICATION_X_WWW_FORM_URLENCODED)) {
+// contentCharSet = post.getRequestCharSet();
+// }
+// StringRequestEntity requestEntity = new StringRequestEntity(getQueryString(contentEncoding), post.getRequestHeader(HEADER_CONTENT_TYPE).getValue(), contentCharSet);
+// post.setRequestEntity(requestEntity);
+*/
+ }
+
+ // If the request entity is repeatable, we can send it first to
+ // our own stream, so we can return it
+ if(post.getRequestEntity().isRepeatable()) {
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ post.getRequestEntity().writeRequest(bos);
+ bos.flush();
+ // We get the posted bytes using the encoding used to create it
+ postedBody.append(new String(bos.toByteArray(),post.getRequestCharSet()));
+ bos.close();
+ }
+ else {
+ postedBody.append("<RequestEntity was not repeatable, cannot view what was sent>");
+ }
+ }
+ }
+ // Set the content length
+ post.setRequestHeader(HEADER_CONTENT_LENGTH, Long.toString(post.getRequestEntity().getContentLength()));
+
+ return postedBody.toString();
+ }
+
/**
* Set up the PUT data
*/
---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@jakarta.apache.org
For additional commands, e-mail: notifications-help@jakarta.apache.org