package com.android.volley.misc;
import org.apache.http.util.EncodingUtils;
import java.io.File;
import java.util.Map;
/**
* Created by HaKr on 08/02/15.
*/
public class MultipartUtils {
private MultipartUtils() {}
public static final String CRLF = "\r\n";
public static final String HEADER_CONTENT_TYPE = "Content-Type";
public static final String HEADER_USER_AGENT = "User-Agent";
public static final String HEADER_CONTENT_DISPOSITION = "Content-Disposition";
public static final String HEADER_CONTENT_TRANSFER_ENCODING = "Content-Transfer-Encoding";
public static final String CONTENT_TYPE_MULTIPART = "multipart/form-data; charset=%s; boundary=%s";
public static final String BINARY = "binary";
public static final String EIGHT_BIT = "8bit";
public static final String FORM_DATA = "form-data; name=\"%s\"";
public static final String BOUNDARY_PREFIX = "--";
public static final String CONTENT_TYPE_OCTET_STREAM = "application/octet-stream";
public static final String FILENAME = "filename=\"%s\"";
public static final String COLON_SPACE = ": ";
public static final String SEMICOLON_SPACE = "; ";
public static final int CRLF_LENGTH = CRLF.getBytes().length;
public static final int HEADER_CONTENT_DISPOSITION_LENGTH = HEADER_CONTENT_DISPOSITION.getBytes().length;
public static final int COLON_SPACE_LENGTH = COLON_SPACE.getBytes().length;
public static final int HEADER_CONTENT_TYPE_LENGTH = HEADER_CONTENT_TYPE.getBytes().length;
public static final int CONTENT_TYPE_OCTET_STREAM_LENGTH = CONTENT_TYPE_OCTET_STREAM.getBytes().length;
public static final int HEADER_CONTENT_TRANSFER_ENCODING_LENGTH = HEADER_CONTENT_TRANSFER_ENCODING.getBytes().length;
public static final int BINARY_LENGTH = BINARY.getBytes().length;
public static final int BOUNDARY_PREFIX_LENGTH = BOUNDARY_PREFIX.getBytes().length;
public static final byte[] CRLF_BYTES = EncodingUtils.getAsciiBytes(CRLF);
public static int getContentLengthForMultipartRequest(String boundary, Map<String, MultiPartParam> multipartParams, Map<String, String> filesToUpload) {
final int boundaryLength = boundary.getBytes().length;
int contentLength = 0;
for (Map.Entry<String, MultiPartParam> multipartParam : multipartParams.entrySet()) {
MultiPartParam param = multipartParam.getValue();
int size = boundaryLength +
CRLF_LENGTH + HEADER_CONTENT_DISPOSITION_LENGTH + COLON_SPACE_LENGTH + String.format(FORM_DATA, multipartParam.getKey()).getBytes().length +
CRLF_LENGTH + HEADER_CONTENT_TYPE_LENGTH + COLON_SPACE_LENGTH + param.contentType.getBytes().length +
CRLF_LENGTH + CRLF_LENGTH + param.value.getBytes().length + CRLF_LENGTH;
contentLength += size;
}
for (Map.Entry<String, String> filetoUpload : filesToUpload.entrySet()) {
File file = new File(filetoUpload.getValue());
int size = boundaryLength +
CRLF_LENGTH + HEADER_CONTENT_DISPOSITION_LENGTH + COLON_SPACE_LENGTH + String.format(FORM_DATA + SEMICOLON_SPACE + FILENAME, filetoUpload.getKey(), file.getName()).getBytes().length +
CRLF_LENGTH + HEADER_CONTENT_TYPE_LENGTH + COLON_SPACE_LENGTH + CONTENT_TYPE_OCTET_STREAM_LENGTH +
CRLF_LENGTH + HEADER_CONTENT_TRANSFER_ENCODING_LENGTH + COLON_SPACE_LENGTH + BINARY_LENGTH + CRLF_LENGTH + CRLF_LENGTH;
size += (int) file.length();
size += CRLF_LENGTH;
contentLength += size;
}
int size = boundaryLength + BOUNDARY_PREFIX_LENGTH + CRLF_LENGTH;
contentLength += size;
return contentLength;
}
}