Search in sources :

Example 6 with HTTPFileArg

use of org.apache.jmeter.protocol.http.util.HTTPFileArg in project jmeter by apache.

the class PostWriter method setHeaders.

public void setHeaders(URLConnection connection, HTTPSamplerBase sampler) throws IOException {
    // Get the encoding to use for the request
    String contentEncoding = sampler.getContentEncoding();
    if (contentEncoding == null || contentEncoding.length() == 0) {
        contentEncoding = ENCODING;
    }
    long contentLength = 0L;
    HTTPFileArg[] files = sampler.getHTTPFiles();
    // application/x-www-form-urlencoded post request
    if (sampler.getUseMultipartForPost()) {
        // Set the content type
        connection.setRequestProperty(HTTPConstants.HEADER_CONTENT_TYPE, // $NON-NLS-1$
        HTTPConstants.MULTIPART_FORM_DATA + "; boundary=" + getBoundary());
        // Write the form section
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        // First the multipart start divider
        bos.write(getMultipartDivider());
        // Add any parameters
        for (JMeterProperty jMeterProperty : sampler.getArguments()) {
            HTTPArgument arg = (HTTPArgument) jMeterProperty.getObjectValue();
            String parameterName = arg.getName();
            if (arg.isSkippable(parameterName)) {
                continue;
            }
            // End the previous multipart
            bos.write(CRLF);
            // Write multipart for parameter
            writeFormMultipart(bos, parameterName, arg.getValue(), contentEncoding, sampler.getDoBrowserCompatibleMultipart());
        }
        // If there are any files, we need to end the previous multipart
        if (files.length > 0) {
            // End the previous multipart
            bos.write(CRLF);
        }
        bos.flush();
        // Keep the content, will be sent later
        formDataPostBody = bos.toByteArray();
        bos.close();
        contentLength = formDataPostBody.length;
        // the actual file content
        for (int i = 0; i < files.length; i++) {
            HTTPFileArg file = files[i];
            // Write multipart for file
            bos = new ByteArrayOutputStream();
            writeStartFileMultipart(bos, file.getPath(), file.getParamName(), file.getMimeType());
            bos.flush();
            // TODO is this correct?
            String header = bos.toString(contentEncoding);
            // If this is not the first file we can't write its header now
            // for simplicity we always save it, even if there is only one file
            file.setHeader(header);
            bos.close();
            contentLength += header.length();
            // Add also the length of the file content
            File uploadFile = new File(file.getPath());
            contentLength += uploadFile.length();
            // And the end of the file multipart
            contentLength += getFileMultipartEndDivider().length;
            if (i + 1 < files.length) {
                contentLength += CRLF.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()) {
            // we're sure that there is one file because of
            // getSendFileAsPostBody method's return value.
            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) {
                    connection.setRequestProperty(HTTPConstants.HEADER_CONTENT_TYPE, file.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(file.getPath());
            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 {
                // 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) {
                        connection.setRequestProperty(HTTPConstants.HEADER_CONTENT_TYPE, file.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
                StringBuilder postBodyBuffer = new StringBuilder();
                for (JMeterProperty jMeterProperty : sampler.getArguments()) {
                    HTTPArgument arg = (HTTPArgument) jMeterProperty.getObjectValue();
                    postBodyBuffer.append(arg.getEncodedValue(contentEncoding));
                }
                postBody = postBodyBuffer.toString();
            }
            bos.write(postBody.getBytes(contentEncoding));
            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);
    }
}
Also used : JMeterProperty(org.apache.jmeter.testelement.property.JMeterProperty) HTTPArgument(org.apache.jmeter.protocol.http.util.HTTPArgument) ByteArrayOutputStream(java.io.ByteArrayOutputStream) HTTPFileArg(org.apache.jmeter.protocol.http.util.HTTPFileArg) File(java.io.File)

Example 7 with HTTPFileArg

use of org.apache.jmeter.protocol.http.util.HTTPFileArg in project jmeter by apache.

the class HTTPFileArgsPanel method modifyTestElement.

/**
     * Save the GUI data in the HTTPSamplerBase element.
     *
     * @param testElement {@link TestElement} to modify
     */
public void modifyTestElement(TestElement testElement) {
    GuiUtils.stopTableEditing(table);
    if (testElement instanceof HTTPSamplerBase) {
        HTTPSamplerBase base = (HTTPSamplerBase) testElement;
        int rows = tableModel.getRowCount();
        // we only put HTTPFileArgs in it
        @SuppressWarnings("unchecked") Iterator<HTTPFileArg> modelData = (Iterator<HTTPFileArg>) tableModel.iterator();
        HTTPFileArg[] files = new HTTPFileArg[rows];
        int row = 0;
        while (modelData.hasNext()) {
            HTTPFileArg file = modelData.next();
            files[row++] = file;
        }
        base.setHTTPFiles(files);
    }
}
Also used : Iterator(java.util.Iterator) HTTPFileArg(org.apache.jmeter.protocol.http.util.HTTPFileArg) HTTPSamplerBase(org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase)

Example 8 with HTTPFileArg

use of org.apache.jmeter.protocol.http.util.HTTPFileArg in project jmeter by apache.

the class PutWriter method setHeaders.

@Override
public void setHeaders(URLConnection connection, HTTPSamplerBase sampler) throws IOException {
    // Get the encoding to use for the request
    String contentEncoding = sampler.getContentEncoding();
    if (contentEncoding == null || contentEncoding.length() == 0) {
        contentEncoding = ENCODING;
    }
    long contentLength = 0L;
    boolean hasPutBody = false;
    // Check if the header manager had a content type header
    // This allows the user to specify his own content-type for a PUT request
    String contentTypeHeader = connection.getRequestProperty(HTTPConstants.HEADER_CONTENT_TYPE);
    boolean hasContentTypeHeader = contentTypeHeader != null && contentTypeHeader.length() > 0;
    HTTPFileArg[] files = sampler.getHTTPFiles();
    // 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 getSendFileAsPostBody returned true, it's sure that file is not null
        HTTPFileArg file = files[0];
        hasPutBody = true;
        if (!hasContentTypeHeader) {
            // Allow the mimetype of the file to control the content type
            if (file.getMimeType().length() > 0) {
                connection.setRequestProperty(HTTPConstants.HEADER_CONTENT_TYPE, file.getMimeType());
            }
        }
        // Create the content length we are going to write
        File inputFile = new File(file.getPath());
        contentLength = inputFile.length();
    } else if (sampler.getSendParameterValuesAsPostBody()) {
        hasPutBody = true;
        // but just sending the content of nameless parameters
        if (!hasContentTypeHeader && files.length == 1 && files[0].getMimeType().length() > 0) {
            connection.setRequestProperty(HTTPConstants.HEADER_CONTENT_TYPE, files[0].getMimeType());
        }
        // We create the post body content now, so we know the size
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        // Just append all the parameter values, and use that as the put body
        StringBuilder putBodyBuffer = new StringBuilder();
        for (JMeterProperty jMeterProperty : sampler.getArguments()) {
            HTTPArgument arg = (HTTPArgument) jMeterProperty.getObjectValue();
            putBodyBuffer.append(arg.getEncodedValue(contentEncoding));
        }
        bos.write(putBodyBuffer.toString().getBytes(contentEncoding));
        bos.flush();
        bos.close();
        // Keep the content, will be sent later
        formDataUrlEncoded = bos.toByteArray();
        contentLength = bos.toByteArray().length;
    }
    if (hasPutBody) {
        // Set the content length
        connection.setRequestProperty(HTTPConstants.HEADER_CONTENT_LENGTH, Long.toString(contentLength));
        // Make the connection ready for sending post data
        connection.setDoOutput(true);
    }
}
Also used : JMeterProperty(org.apache.jmeter.testelement.property.JMeterProperty) HTTPArgument(org.apache.jmeter.protocol.http.util.HTTPArgument) ByteArrayOutputStream(java.io.ByteArrayOutputStream) HTTPFileArg(org.apache.jmeter.protocol.http.util.HTTPFileArg) File(java.io.File)

Example 9 with HTTPFileArg

use of org.apache.jmeter.protocol.http.util.HTTPFileArg in project jmeter by apache.

the class PutWriterTest method testSetHeadersWithParams.

@Test
public void testSetHeadersWithParams() throws Exception {
    URLConnection uc = new NullURLConnection();
    HTTPSampler sampler = new HTTPSampler();
    sampler.setHTTPFiles(new HTTPFileArg[] { new HTTPFileArg("file2", "param2", "mime2") });
    Arguments arguments = new Arguments();
    arguments.addArgument(new HTTPArgument("", "parameter with no name"));
    sampler.setArguments(arguments);
    PutWriter pw = new PutWriter();
    pw.setHeaders(uc, sampler);
    assertEquals("mime2", uc.getRequestProperty(HTTPConstants.HEADER_CONTENT_TYPE));
}
Also used : HTTPArgument(org.apache.jmeter.protocol.http.util.HTTPArgument) Arguments(org.apache.jmeter.config.Arguments) HTTPFileArg(org.apache.jmeter.protocol.http.util.HTTPFileArg) URLConnection(java.net.URLConnection) Test(org.junit.Test)

Example 10 with HTTPFileArg

use of org.apache.jmeter.protocol.http.util.HTTPFileArg in project jmeter by apache.

the class TestHTTPSamplers method testFileList.

@Test
public void testFileList() {
    HTTPSamplerBase config = new HTTPNullSampler();
    HTTPFileArg[] arg;
    arg = config.getHTTPFiles();
    assertNotNull(arg);
    assertEquals(0, arg.length);
    config.setHTTPFiles(new HTTPFileArg[] { new HTTPFileArg("", "", "") });
    arg = config.getHTTPFiles();
    assertNotNull(arg);
    assertEquals(0, arg.length);
    config.setHTTPFiles(new HTTPFileArg[] { new HTTPFileArg("", "", "text/plain") });
    arg = config.getHTTPFiles();
    assertNotNull(arg);
    assertEquals(1, arg.length);
    assertEquals("text/plain", arg[0].getMimeType());
    assertEquals("", arg[0].getPath());
    assertEquals("", arg[0].getParamName());
    config.setHTTPFiles(new HTTPFileArg[] { new HTTPFileArg("/tmp/test123.tmp", "test123.tmp", "text/plain") });
    arg = config.getHTTPFiles();
    assertNotNull(arg);
    assertEquals(1, arg.length);
    assertEquals("text/plain", arg[0].getMimeType());
    assertEquals("/tmp/test123.tmp", arg[0].getPath());
    assertEquals("test123.tmp", arg[0].getParamName());
    HTTPFileArg[] files = {};
    // Ignore empty file specs
    config.setHTTPFiles(files);
    arg = config.getHTTPFiles();
    assertNotNull(arg);
    assertEquals(0, arg.length);
    files = new HTTPFileArg[] { new HTTPFileArg(), new HTTPFileArg() };
    config.setHTTPFiles(files);
    arg = config.getHTTPFiles();
    assertNotNull(arg);
    assertEquals(0, arg.length);
    // Ignore trailing empty spec
    files = new HTTPFileArg[] { new HTTPFileArg("file"), new HTTPFileArg() };
    config.setHTTPFiles(files);
    arg = config.getHTTPFiles();
    assertNotNull(arg);
    assertEquals(1, arg.length);
    // Ignore leading empty spec
    files = new HTTPFileArg[] { new HTTPFileArg(), new HTTPFileArg("file1"), new HTTPFileArg(), new HTTPFileArg("file2"), new HTTPFileArg() };
    config.setHTTPFiles(files);
    arg = config.getHTTPFiles();
    assertNotNull(arg);
    assertEquals(2, arg.length);
}
Also used : HTTPFileArg(org.apache.jmeter.protocol.http.util.HTTPFileArg) Test(org.junit.Test)

Aggregations

HTTPFileArg (org.apache.jmeter.protocol.http.util.HTTPFileArg)24 Test (org.junit.Test)9 File (java.io.File)6 JMeterProperty (org.apache.jmeter.testelement.property.JMeterProperty)6 Arguments (org.apache.jmeter.config.Arguments)5 HTTPArgument (org.apache.jmeter.protocol.http.util.HTTPArgument)5 ByteArrayOutputStream (java.io.ByteArrayOutputStream)4 HTTPFileArgs (org.apache.jmeter.protocol.http.util.HTTPFileArgs)4 HTTPSamplerBase (org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase)3 URLConnection (java.net.URLConnection)2 HttpEntity (org.apache.http.HttpEntity)2 FileEntity (org.apache.http.entity.FileEntity)2 StringEntity (org.apache.http.entity.StringEntity)2 Argument (org.apache.jmeter.config.Argument)2 AuthManager (org.apache.jmeter.protocol.http.control.AuthManager)2 HeaderManager (org.apache.jmeter.protocol.http.control.HeaderManager)2 BufferedInputStream (java.io.BufferedInputStream)1 ByteArrayInputStream (java.io.ByteArrayInputStream)1 FileInputStream (java.io.FileInputStream)1 IOException (java.io.IOException)1