001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: *
017: */
018:
019: package org.apache.jmeter.protocol.http.sampler;
020:
021: import java.io.ByteArrayOutputStream;
022: import java.io.File;
023: import java.io.IOException;
024: import java.net.URLConnection;
025:
026: import org.apache.jmeter.protocol.http.util.HTTPArgument;
027: import org.apache.jmeter.protocol.http.util.HTTPConstants;
028: import org.apache.jmeter.testelement.property.PropertyIterator;
029:
030: /**
031: * Class for setting the necessary headers for a PUT request, and sending the
032: * body of the PUT.
033: */
034: public class PutWriter extends PostWriter {
035: /**
036: * Constructor for PutWriter.
037: */
038: public PutWriter() {
039: // Put request does not use multipart, so no need for boundary
040: super (null);
041: }
042:
043: public void setHeaders(URLConnection connection, HTTPSampler sampler)
044: throws IOException {
045: // Get the encoding to use for the request
046: String contentEncoding = sampler.getContentEncoding();
047: if (contentEncoding == null || contentEncoding.length() == 0) {
048: contentEncoding = ENCODING;
049: }
050: long contentLength = 0L;
051: boolean hasPutBody = false;
052:
053: // Check if the header manager had a content type header
054: // This allows the user to specify his own content-type for a PUT request
055: String contentTypeHeader = connection
056: .getRequestProperty(HTTPConstants.HEADER_CONTENT_TYPE);
057: boolean hasContentTypeHeader = contentTypeHeader != null
058: && contentTypeHeader.length() > 0;
059:
060: // If there are no arguments, we can send a file as the body of the request
061: if (sampler.getArguments() != null
062: && sampler.getArguments().getArgumentCount() == 0
063: && sampler.getSendFileAsPostBody()) {
064: hasPutBody = true;
065: if (!hasContentTypeHeader) {
066: // Allow the mimetype of the file to control the content type
067: if (sampler.getMimetype() != null
068: && sampler.getMimetype().length() > 0) {
069: connection.setRequestProperty(
070: HTTPConstants.HEADER_CONTENT_TYPE, sampler
071: .getMimetype());
072: }
073: }
074:
075: // Create the content length we are going to write
076: File inputFile = new File(sampler.getFilename());
077: contentLength = inputFile.length();
078: } else if (sampler.getSendParameterValuesAsPostBody()) {
079: hasPutBody = true;
080: // Allow the mimetype of the file to control the content type
081: // This is not obvious in GUI if you are not uploading any files,
082: // but just sending the content of nameless parameters
083: if (!hasContentTypeHeader && sampler.getMimetype() != null
084: && sampler.getMimetype().length() > 0) {
085: connection.setRequestProperty(
086: HTTPConstants.HEADER_CONTENT_TYPE, sampler
087: .getMimetype());
088: }
089:
090: // We create the post body content now, so we know the size
091: ByteArrayOutputStream bos = new ByteArrayOutputStream();
092:
093: // Just append all the parameter values, and use that as the put body
094: StringBuffer postBodyBuffer = new StringBuffer();
095: PropertyIterator args = sampler.getArguments().iterator();
096: while (args.hasNext()) {
097: HTTPArgument arg = (HTTPArgument) args.next()
098: .getObjectValue();
099: postBodyBuffer.append(arg
100: .getEncodedValue(contentEncoding));
101: }
102: String postBody = postBodyBuffer.toString();
103:
104: // Query string should be encoded in UTF-8
105: bos.write(postBody.getBytes("UTF-8")); // $NON-NLS-1$
106: bos.flush();
107: bos.close();
108:
109: // Keep the content, will be sent later
110: formDataUrlEncoded = bos.toByteArray();
111: contentLength = bos.toByteArray().length;
112: }
113: if (hasPutBody) {
114: // Set the content length
115: connection.setRequestProperty(
116: HTTPConstants.HEADER_CONTENT_LENGTH, Long
117: .toString(contentLength));
118:
119: // Make the connection ready for sending post data
120: connection.setDoOutput(true);
121: }
122: }
123: }
|