org.wisdom.test.http.MultipartBody Maven / Gradle / Ivy
/*
* #%L
* Wisdom-Framework
* %%
* Copyright (C) 2013 - 2014 Wisdom Framework
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*/
package org.wisdom.test.http;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.message.BasicNameValuePair;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
/**
* An implementation of HTTP Request used to send the results from a form. It's useful when testing controller expecting
* input from forms.
*
* To use this class, creates a regular request that you give this class (in the constructor).
*/
public class
MultipartBody extends BaseRequest implements Body {
private Map parameters = new HashMap();
private boolean hasFile;
private HttpRequest httpRequestObj;
/**
* Creates the Multipart body from the given request.
*
* @param httpRequest the base request, must not be {@literal null}.
*/
public MultipartBody(HttpRequest httpRequest) {
super(httpRequest);
this.httpRequestObj = httpRequest;
}
/**
* Adds a field.
*
* @param name the field's name
* @param value the value
* @return the current multipart body
*/
public MultipartBody field(String name, String value) {
parameters.put(name, value);
return this;
}
/**
* Adds an upload file.
*
* @param name the field's name
* @param file the file to upload
* @return the current multipart body
*/
public MultipartBody field(String name, File file) {
this.parameters.put(name, file);
hasFile = true;
return this;
}
/**
* Sets the basic authentication.
*
* @param username the username
* @param password the password
* @return the current multipart body
*/
public MultipartBody basicAuth(String username, String password) {
httpRequestObj.basicAuth(username, password);
return this;
}
/**
* Computes the request payload.
*
* @return the payload containing the declared fields and files.
*/
public HttpEntity getEntity() {
if (hasFile) {
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
for (Entry part : parameters.entrySet()) {
if (part.getValue() instanceof File) {
hasFile = true;
builder.addPart(part.getKey(), new FileBody((File) part.getValue()));
} else {
builder.addPart(part.getKey(), new StringBody(part.getValue().toString(), ContentType.APPLICATION_FORM_URLENCODED));
}
}
return builder.build();
} else {
try {
return new UrlEncodedFormEntity(getList(parameters), UTF_8);
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
}
/**
* A helper method to build a list a {@link org.apache.http.NameValuePair} from a map of parameters.
*
* @param parameters the parameters
* @return the list
*/
public static List getList(Map parameters) {
List result = new ArrayList<>();
if (parameters != null) {
for (Map.Entry entry : parameters.entrySet()) {
if (entry.getValue() != null) {
result.add(new BasicNameValuePair(entry.getKey(), entry.getValue().toString()));
}
}
}
return result;
}
}