📄 httpsampler2.java
字号:
}
// Create the parts
Part[] parts = new Part[noParts];
int partNo = 0;
// Add any parameters
PropertyIterator args = getArguments().iterator();
while (args.hasNext()) {
HTTPArgument arg = (HTTPArgument) args.next().getObjectValue();
String parameterName = arg.getName();
if (parameterName.length()==0){
continue; // Skip parameters with a blank name (allows use of optional variables in parameter lists)
}
parts[partNo++] = new StringPart(arg.getName(), arg.getValue(), contentEncoding);
}
// Add any files
if(hasUploadableFiles()) {
File inputFile = new File(getFilename());
// We do not know the char set of the file to be uploaded, so we set it to null
ViewableFilePart filePart = new ViewableFilePart(getFileField(), inputFile, getMimetype(), null);
filePart.setCharSet(null); // We do not know what the char set of the file is
parts[partNo++] = filePart;
}
// Set the multipart for the post
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 as UTF-8, since java is using UTF-8
postedBody.append(new String(bos.toByteArray() , "UTF-8")); // $NON-NLS-1$
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
if(!hasArguments() && getSendFileAsPostBody()) {
if(!hasContentTypeHeader) {
// Allow the mimetype of the file to control the content type
if(getMimetype() != null && getMimetype().length() > 0) {
post.setRequestHeader(HEADER_CONTENT_TYPE, getMimetype());
}
else {
post.setRequestHeader(HEADER_CONTENT_TYPE, APPLICATION_X_WWW_FORM_URLENCODED);
}
}
FileRequestEntity fileRequestEntity = new FileRequestEntity(new File(getFilename()),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
final String contentEncoding = getContentEncoding();
boolean haveContentEncoding = false;
if(contentEncoding != null && contentEncoding.trim().length() > 0) {
post.getParams().setContentCharset(contentEncoding);
haveContentEncoding = true;
}
// 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
if(!hasContentTypeHeader) {
if(getMimetype() != null && getMimetype().length() > 0) {
post.setRequestHeader(HEADER_CONTENT_TYPE, getMimetype());
}
else {
// TODO - is this the correct default?
post.setRequestHeader(HEADER_CONTENT_TYPE, APPLICATION_X_WWW_FORM_URLENCODED);
}
}
// Just append all the non-empty parameter values, and use that as the post body
StringBuffer postBody = new StringBuffer();
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(), post.getRequestCharSet());
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 (parameterName.length()==0){
continue; // Skip parameters with a blank name (allows use of optional variables in parameter lists)
}
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 as UTF-8, since java is using UTF-8
postedBody.append(new String(bos.toByteArray() , "UTF-8")); // $NON-NLS-1$
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
* connection. This means it sets the request method (GET or POST), headers,
* cookies, and authorization for the URL request.
* <p>
* The request infos are saved into the sample result if one is provided.
*
* @param u
* <code>URL</code> of the URL request
* @param httpMethod
* GET/PUT/HEAD etc
* @param res
* sample result to save request infos to
* @return <code>HttpConnection</code> ready for .connect
* @exception IOException
* if an I/O Exception occurs
*/
protected HttpClient setupConnection(URL u, HttpMethodBase httpMethod, HTTPSampleResult res) throws IOException {
String urlStr = u.toString();
org.apache.commons.httpclient.URI uri = new org.apache.commons.httpclient.URI(urlStr,false);
String schema = uri.getScheme();
if ((schema == null) || (schema.length()==0)) {
schema = PROTOCOL_HTTP;
}
if (PROTOCOL_HTTPS.equalsIgnoreCase(schema)){
SSLManager.getInstance(); // ensure the manager is initialised
// we don't currently need to do anything further, as this sets the default https protocol
}
Protocol protocol = Protocol.getProtocol(schema);
String host = uri.getHost();
int port = uri.getPort();
/*
* We use the HostConfiguration as the key to retrieve the HttpClient,
* so need to ensure that any items used in its equals/hashcode methods are
* not changed after use, i.e.:
* host, port, protocol, localAddress, proxy
*
*/
HostConfiguration hc = new HostConfiguration();
hc.setHost(host, port, protocol); // All needed to ensure re-usablility
// Set up the local address if one exists
if (localAddress != null){
hc.setLocalAddress(localAddress);
}
boolean useProxy = PROXY_DEFINED && !isNonProxy(host);
if (useProxy) {
if (log.isDebugEnabled()){
log.debug("Setting proxy: "+PROXY_HOST+":"+PROXY_PORT);
}
hc.setProxy(PROXY_HOST, PROXY_PORT);
}
Map map = (Map) httpClients.get();
HttpClient httpClient = (HttpClient) map.get(hc);
if ( httpClient == null )
{
httpClient = new HttpClient(new SimpleHttpConnectionManager());
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -