package com.nvarghese.beowulf.common.http.payload;
import java.io.IOException;
import java.nio.charset.UnsupportedCharsetException;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.HttpRequest;
import org.apache.http.NameValuePair;
import org.apache.http.ParseException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class RequestPayloadFactory {
static Logger logger = LoggerFactory.getLogger(RequestPayloadFactory.class);
public static RequestPayload createRequestPayload(HttpRequest request) {
if (request instanceof HttpEntityEnclosingRequestBase) {
HttpEntity entity = ((HttpEntityEnclosingRequestBase) request).getEntity();
return convertToRequestPayload(entity);
} else {
HttpUriRequest uriRequest = (HttpUriRequest) request;
return new UrlEncodedRequestPayload(URLEncodedUtils.parse(uriRequest.getURI(), "ISO-8559-1"));
}
}
public static RequestPayload convertToRequestPayload(HttpEntity entity) {
if (entity instanceof UrlEncodedFormEntity) {
UrlEncodedFormEntity UrlEncodedFormEntity = (UrlEncodedFormEntity) entity;
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
try {
nvps = URLEncodedUtils.parse(UrlEncodedFormEntity);
} catch (IOException e) {
logger.error("Failed to parse urlencoded string. Reason: {}", e.getMessage(), e);
}
return new UrlEncodedRequestPayload(nvps);
} else if (entity instanceof MultipartEntity) {
// no parser for multipart data
return new MultipartEncodedRequestPayload();
} else if (entity instanceof StringEntity) {
StringEntity stringEntity = (StringEntity) entity;
byte[] bytes = new byte[0];
try {
bytes = EntityUtils.toByteArray(stringEntity);
} catch (UnsupportedCharsetException e) {
logger.error("Failed to convert to bytearray. Reason: {}", e.getMessage(), e);
} catch (ParseException e) {
logger.error("Failed to convert to bytearray. Reason: {}", e.getMessage(), e);
} catch (IOException e) {
logger.error("Failed to convert to bytearray. Reason: {}", e.getMessage(), e);
}
return new ByteArrayRequestPayload(bytes, ContentType.get(stringEntity));
} else {
return new EntityWrappedRequestPayload(entity);
}
}
}