📄 postwriter.java
字号:
contentLength += getFileMultipartEndDivider().length;
}
// Add the end of multipart
contentLength += getMultipartEndDivider().length;
// Set the content length
connection.setRequestProperty(HTTPConstants.HEADER_CONTENT_LENGTH, Long.toString(contentLength));
// Make the connection ready for sending post data
connection.setDoOutput(true);
connection.setDoInput(true);
}
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
String contentTypeHeader = connection.getRequestProperty(HTTPConstants.HEADER_CONTENT_TYPE);
boolean hasContentTypeHeader = contentTypeHeader != null && contentTypeHeader.length() > 0;
// If there are no arguments, we can send a file as the body of the request
if(sampler.getArguments() != null && sampler.getArguments().getArgumentCount() == 0 && sampler.getSendFileAsPostBody()) {
if(!hasContentTypeHeader) {
// Allow the mimetype of the file to control the content type
if(sampler.getMimetype() != null && sampler.getMimetype().length() > 0) {
connection.setRequestProperty(HTTPConstants.HEADER_CONTENT_TYPE, sampler.getMimetype());
}
else {
connection.setRequestProperty(HTTPConstants.HEADER_CONTENT_TYPE, HTTPConstants.APPLICATION_X_WWW_FORM_URLENCODED);
}
}
// Create the content length we are going to write
File inputFile = new File(sampler.getFilename());
contentLength = inputFile.length();
}
else {
// We create the post body content now, so we know the size
ByteArrayOutputStream bos = new ByteArrayOutputStream();
// If none of the arguments have a name specified, we
// just send all the values as the post body
String postBody = null;
if(!sampler.getSendParameterValuesAsPostBody()) {
// Set the content type
if(!hasContentTypeHeader) {
connection.setRequestProperty(HTTPConstants.HEADER_CONTENT_TYPE, HTTPConstants.APPLICATION_X_WWW_FORM_URLENCODED);
}
// It is a normal post request, with parameter names and values
postBody = sampler.getQueryString(contentEncoding);
}
else {
// 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(sampler.getMimetype() != null && sampler.getMimetype().length() > 0) {
connection.setRequestProperty(HTTPConstants.HEADER_CONTENT_TYPE, sampler.getMimetype());
}
else {
// TODO: is this the correct default?
connection.setRequestProperty(HTTPConstants.HEADER_CONTENT_TYPE, HTTPConstants.APPLICATION_X_WWW_FORM_URLENCODED);
}
}
// Just append all the parameter values, and use that as the post body
StringBuffer postBodyBuffer = new StringBuffer();
PropertyIterator args = sampler.getArguments().iterator();
while (args.hasNext()) {
HTTPArgument arg = (HTTPArgument) args.next().getObjectValue();
postBodyBuffer.append(arg.getEncodedValue(contentEncoding));
}
postBody = postBodyBuffer.toString();
}
// Query string should be encoded in UTF-8
bos.write(postBody.getBytes("UTF-8")); // $NON-NLS-1$
bos.flush();
bos.close();
// Keep the content, will be sent later
formDataUrlEncoded = bos.toByteArray();
contentLength = bos.toByteArray().length;
}
// Set the content length
connection.setRequestProperty(HTTPConstants.HEADER_CONTENT_LENGTH, Long.toString(contentLength));
// Make the connection ready for sending post data
connection.setDoOutput(true);
}
}
/**
* Get the boundary string, used to separate multiparts
*
* @return the boundary string
*/
protected String getBoundary() {
return boundary;
}
/**
* Get the bytes used to separate multiparts
*
* @return the bytes used to separate multiparts
* @throws IOException
*/
private byte[] getMultipartDivider() throws IOException {
return (DASH_DASH + getBoundary()).getBytes(ENCODING);
}
/**
* Get the bytes used to end a file multipat
*
* @return the bytes used to end a file multipart
* @throws IOException
*/
private byte[] getFileMultipartEndDivider() throws IOException{
byte[] ending = getMultipartDivider();
byte[] completeEnding = new byte[ending.length + CRLF.length];
System.arraycopy(CRLF, 0, completeEnding, 0, CRLF.length);
System.arraycopy(ending, 0, completeEnding, CRLF.length, ending.length);
return completeEnding;
}
/**
* Get the bytes used to end the multipart request
*
* @return the bytes used to end the multipart request
* @throws IOException
*/
private byte[] getMultipartEndDivider() throws IOException{
byte[] ending = DASH_DASH_BYTES;
byte[] completeEnding = new byte[ending.length + CRLF.length];
System.arraycopy(ending, 0, completeEnding, 0, ending.length);
System.arraycopy(CRLF, 0, completeEnding, ending.length, CRLF.length);
return completeEnding;
}
/**
* Write the start of a file multipart, up to the point where the
* actual file content should be written
*/
private void writeStartFileMultipart(OutputStream out, String filename,
String nameField, String mimetype)
throws IOException {
write(out, "Content-Disposition: form-data; name=\""); // $NON-NLS-1$
write(out, nameField);
write(out, "\"; filename=\"");// $NON-NLS-1$
write(out, (new File(filename).getName()));
writeln(out, "\""); // $NON-NLS-1$
writeln(out, "Content-Type: " + mimetype); // $NON-NLS-1$
writeln(out, "Content-Transfer-Encoding: binary"); // $NON-NLS-1$
out.write(CRLF);
}
/**
* Write the content of a file to the output stream
*
* @param filename the filename of the file to write to the stream
* @param out the stream to write to
* @throws IOException
*/
private void writeFileToStream(String filename, OutputStream out) throws IOException {
byte[] buf = new byte[1024];
// 1k - the previous 100k made no sense (there's tons of buffers
// elsewhere in the chain) and it caused OOM when many concurrent
// uploads were being done. Could be fixed by increasing the evacuation
// ratio in bin/jmeter[.bat], but this is better.
InputStream in = new BufferedInputStream(new FileInputStream(filename));
int read;
try {
while ((read = in.read(buf)) > 0) {
out.write(buf, 0, read);
}
}
finally {
in.close();
}
}
/**
* Writes form data in multipart format.
*/
private void writeFormMultipart(OutputStream out, String name, String value, String charSet)
throws IOException {
writeln(out, "Content-Disposition: form-data; name=\"" + name + "\""); // $NON-NLS-1$ // $NON-NLS-2$
writeln(out, "Content-Type: text/plain; charset=" + charSet); // $NON-NLS-1$
writeln(out, "Content-Transfer-Encoding: 8bit"); // $NON-NLS-1$
out.write(CRLF);
out.write(value.getBytes(charSet));
out.write(CRLF);
// Write boundary end marker
out.write(getMultipartDivider());
}
private void write(OutputStream out, String value)
throws UnsupportedEncodingException, IOException
{
out.write(value.getBytes(ENCODING));
}
private void writeln(OutputStream out, String value)
throws UnsupportedEncodingException, IOException
{
out.write(value.getBytes(ENCODING));
out.write(CRLF);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -