List of usage examples for org.apache.http.entity.mime MultipartEntityBuilder setLaxMode
public MultipartEntityBuilder setLaxMode()
From source file:de.geeksfactory.opacclient.apis.Open.java
/** * Better version of JSoup's implementation of this function ({@link * org.jsoup.nodes.FormElement#formData()}). * * @param form The form to submit/*from w w w . ja va2 s . c o m*/ * @param submitName The name attribute of the button which is clicked to submit the form, or * null * @return A MultipartEntityBuilder containing the data of the form */ protected MultipartEntityBuilder formData(FormElement form, String submitName) { MultipartEntityBuilder data = MultipartEntityBuilder.create(); data.setLaxMode(); // iterate the form control elements and accumulate their values for (Element el : form.elements()) { if (!el.tag().isFormSubmittable()) { continue; // contents are form listable, superset of submitable } String name = el.attr("name"); if (name.length() == 0) continue; String type = el.attr("type"); if ("select".equals(el.tagName())) { Elements options = el.select("option[selected]"); boolean set = false; for (Element option : options) { data.addTextBody(name, option.val()); set = true; } if (!set) { Element option = el.select("option").first(); if (option != null) { data.addTextBody(name, option.val()); } } } else if ("checkbox".equalsIgnoreCase(type) || "radio".equalsIgnoreCase(type)) { // only add checkbox or radio if they have the checked attribute if (el.hasAttr("checked")) { data.addTextBody(name, el.val().length() > 0 ? el.val() : "on"); } } else if ("submit".equalsIgnoreCase(type) || "image".equalsIgnoreCase(type)) { if (submitName != null && el.attr("name").contains(submitName)) { data.addTextBody(name, el.val()); } } else { data.addTextBody(name, el.val()); } } return data; }
From source file:org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.java
/** * /*from ww w . j a va2s. c om*/ * @param post {@link HttpPost} * @return String posted body if computable * @throws IOException if sending the data fails due to I/O */ protected String sendPostData(HttpPost post) throws IOException { // Buffer to hold the post body, except file content StringBuilder postedBody = new StringBuilder(1000); HTTPFileArg[] files = getHTTPFiles(); final String contentEncoding = getContentEncodingOrNull(); final boolean haveContentEncoding = contentEncoding != null; // 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 Charset charset = null; if (haveContentEncoding) { charset = Charset.forName(contentEncoding); } else { charset = MIME.DEFAULT_CHARSET; } if (log.isDebugEnabled()) { log.debug("Building multipart with:getDoBrowserCompatibleMultipart():" + getDoBrowserCompatibleMultipart() + ", with charset:" + charset + ", haveContentEncoding:" + haveContentEncoding); } // Write the request to our own stream MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create().setCharset(charset); if (getDoBrowserCompatibleMultipart()) { multipartEntityBuilder.setLaxMode(); } else { multipartEntityBuilder.setStrictMode(); } // Create the parts // Add any parameters for (JMeterProperty jMeterProperty : getArguments()) { HTTPArgument arg = (HTTPArgument) jMeterProperty.getObjectValue(); String parameterName = arg.getName(); if (arg.isSkippable(parameterName)) { continue; } StringBody stringBody = new StringBody(arg.getValue(), ContentType.create("text/plain", charset)); FormBodyPart formPart = FormBodyPartBuilder.create(parameterName, stringBody).build(); multipartEntityBuilder.addPart(formPart); } // Add any files // Cannot retrieve parts once added to the MultiPartEntity, so have to save them here. ViewableFileBody[] fileBodies = new ViewableFileBody[files.length]; for (int i = 0; i < files.length; i++) { HTTPFileArg file = files[i]; File reservedFile = FileServer.getFileServer().getResolvedFile(file.getPath()); fileBodies[i] = new ViewableFileBody(reservedFile, file.getMimeType()); multipartEntityBuilder.addPart(file.getParamName(), fileBodies[i]); } HttpEntity entity = multipartEntityBuilder.build(); post.setEntity(entity); if (entity.isRepeatable()) { ByteArrayOutputStream bos = new ByteArrayOutputStream(); for (ViewableFileBody fileBody : fileBodies) { fileBody.hideFileData = true; } entity.writeTo(bos); for (ViewableFileBody fileBody : fileBodies) { fileBody.hideFileData = false; } 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(); } else { postedBody.append("<Multipart was not repeatable, cannot view what was sent>"); // $NON-NLS-1$ } // // Set the content type TODO - needed? // String multiPartContentType = multiPart.getContentType().getValue(); // post.setHeader(HEADER_CONTENT_TYPE, multiPartContentType); } else { // not multipart // 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.getFirstHeader(HTTPConstants.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.setHeader(HTTPConstants.HEADER_CONTENT_TYPE, file.getMimeType()); } else { post.setHeader(HTTPConstants.HEADER_CONTENT_TYPE, HTTPConstants.APPLICATION_X_WWW_FORM_URLENCODED); } } FileEntity fileRequestEntity = new FileEntity(new File(file.getPath()), (ContentType) null);// TODO is null correct? post.setEntity(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 if (haveContentEncoding) { post.getParams().setParameter(CoreProtocolPNames.HTTP_CONTENT_CHARSET, contentEncoding); } // 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.setHeader(HTTPConstants.HEADER_CONTENT_TYPE, file.getMimeType()); } else { // TODO - is this the correct default? post.setHeader(HTTPConstants.HEADER_CONTENT_TYPE, HTTPConstants.APPLICATION_X_WWW_FORM_URLENCODED); } } // Just append all the parameter values, and use that as the post body StringBuilder postBody = new StringBuilder(); for (JMeterProperty jMeterProperty : getArguments()) { HTTPArgument arg = (HTTPArgument) jMeterProperty.getObjectValue(); // Note: if "Encoded?" is not selected, arg.getEncodedValue is equivalent to arg.getValue if (haveContentEncoding) { postBody.append(arg.getEncodedValue(contentEncoding)); } else { postBody.append(arg.getEncodedValue()); } } // Let StringEntity perform the encoding StringEntity requestEntity = new StringEntity(postBody.toString(), contentEncoding); post.setEntity(requestEntity); postedBody.append(postBody.toString()); } else { // It is a normal post request, with parameter names and values // Set the content type if (!hasContentTypeHeader) { post.setHeader(HTTPConstants.HEADER_CONTENT_TYPE, HTTPConstants.APPLICATION_X_WWW_FORM_URLENCODED); } // Add the parameters PropertyIterator args = getArguments().iterator(); List<NameValuePair> nvps = new ArrayList<>(); String urlContentEncoding = contentEncoding; if (urlContentEncoding == null || urlContentEncoding.length() == 0) { // Use the default encoding for urls urlContentEncoding = EncoderCache.URL_ARGUMENT_ENCODING; } 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. parameterName = URLDecoder.decode(parameterName, urlContentEncoding); parameterValue = URLDecoder.decode(parameterValue, urlContentEncoding); } // Add the parameter, httpclient will urlencode it nvps.add(new BasicNameValuePair(parameterName, parameterValue)); } UrlEncodedFormEntity entity = new UrlEncodedFormEntity(nvps, urlContentEncoding); post.setEntity(entity); if (entity.isRepeatable()) { ByteArrayOutputStream bos = new ByteArrayOutputStream(); post.getEntity().writeTo(bos); bos.flush(); // We get the posted bytes using the encoding used to create it if (contentEncoding != null) { postedBody.append(new String(bos.toByteArray(), contentEncoding)); } else { postedBody.append(new String(bos.toByteArray(), SampleResult.DEFAULT_HTTP_ENCODING)); } bos.close(); } else { postedBody.append("<RequestEntity was not repeatable, cannot view what was sent>"); } } } } return postedBody.toString(); }