package com.nvarghese.beowulf.common.http.payload; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.Random; import org.apache.http.HttpEntity; import org.apache.http.entity.ContentType; import org.apache.http.entity.mime.MultipartEntity; import org.apache.http.entity.mime.content.ContentBody; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class MultipartEncodedRequestPayload implements RequestPayload { // private String charset; private Map<String, ContentBody> parts = new HashMap<String, ContentBody>(); String boundary; private final static char[] MULTIPART_CHARS = "-_1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray(); static Logger logger = LoggerFactory.getLogger(MultipartEncodedRequestPayload.class); public MultipartEncodedRequestPayload() { parts.clear(); if (boundary == null) boundary = generateBoundary(); } public MultipartEncodedRequestPayload(Map<String, ContentBody> localparts) { parts.clear(); if (boundary == null) boundary = generateBoundary(); for (String name : localparts.keySet()) { parts.put(name, localparts.get(name)); } } public MultipartEncodedRequestPayload(String characterSet, String body) { /* * No decoding logic. Sd we do ? */ } @Override public byte[] getBody() { MultipartEntity reqEntity = (MultipartEntity) toHttpEntity(); ByteArrayOutputStream bout = new ByteArrayOutputStream(); try { reqEntity.writeTo(bout); } catch (IOException e) { logger.error("Failed to convert to bytearray. Reason: {}", e.getMessage(), e); } return bout.toByteArray(); } @Override public HttpEntity toHttpEntity() { if (boundary == null) { boundary = generateBoundary(); } MultipartEntity reqEntity = new MultipartEntity(null, boundary, null); for (String name : parts.keySet()) { reqEntity.addPart(name, parts.get(name)); } return reqEntity; } public void addPart(String name, ContentBody contentBody) { parts.put(name, contentBody); } public Map<String, ContentBody> getParts() { Map<String, ContentBody> cParts = new HashMap<String, ContentBody>(); cParts.putAll(parts); return cParts; } public boolean removePart(String name) { if (parts.keySet().contains(name)) { parts.remove(name); return true; } else return false; } private String generateBoundary() { // copied shamelessly from httpmime ;-) StringBuilder buffer = new StringBuilder(); Random rand = new Random(); int count = rand.nextInt(11) + 30; // a random size from 30 to 40 for (int i = 0; i < count; i++) { buffer.append(MULTIPART_CHARS[rand.nextInt(MULTIPART_CHARS.length)]); } return buffer.toString(); } public ContentBody getPart(String name) { if (parts.keySet().contains(name)) { return parts.get(name); } else return null; } @Override public ContentType getContentType() { return ContentType.MULTIPART_FORM_DATA; } }