package in.srain.cube.request.sender;
import android.text.TextUtils;
import in.srain.cube.request.IRequest;
import in.srain.cube.request.RequestData;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URLConnection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class MultiPartRequestSender extends PostRequestSender {
private static final String LINE_FEED = "\r\n";
private static final String CHARSET_DEFAULT = "UTF-8";
private String mBoundary;
private String mCharset = CHARSET_DEFAULT;
private OutputStream mOutputStream;
private PrintWriter mWriter;
public MultiPartRequestSender(IRequest<?> request, HttpURLConnection httpURLConnection) {
super(request, httpURLConnection);
}
@Override
public void setup() throws IOException {
super.setup();
mBoundary = "===" + System.currentTimeMillis() + "===";
mHttpURLConnection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + mBoundary);
mOutputStream = mHttpURLConnection.getOutputStream();
mWriter = new PrintWriter(new OutputStreamWriter(mOutputStream), true);
}
/**
* post data to Server
*/
public void send() throws IOException {
HashMap<String, RequestData.UploadFileInfo> uploadFiles = mRequestData.getUploadFiles();
HashMap<String, Object> mPostData = mRequestData.getPostData();
// send data to Server
if (mPostData != null && mPostData.size() != 0) {
Iterator<Map.Entry<String, Object>> iterator = mPostData.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, Object> item = iterator.next();
Object value = item.getValue();
if (value == null) {
value = "";
}
addFormField(item.getKey(), value.toString());
}
}
// send file to server
Iterator<Map.Entry<String, RequestData.UploadFileInfo>> iterator = uploadFiles.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, RequestData.UploadFileInfo> item = iterator.next();
RequestData.UploadFileInfo uploadFileInfo = item.getValue();
addFilePart(uploadFileInfo.fieldName, uploadFileInfo.uploadFile, uploadFileInfo.fileName);
}
}
@Override
public void getResponse(StringBuilder sb) throws IOException {
mWriter.append(LINE_FEED).flush();
mWriter.append("--" + mBoundary + "--").append(LINE_FEED);
mWriter.close();
super.getResponse(sb);
}
/**
* Adds a form field to the request
*
* @param name field name
* @param value field value
*/
public void addFormField(String name, String value) {
mWriter.append("--" + mBoundary).append(LINE_FEED);
mWriter.append("Content-Disposition: form-data; name=\"" + name + "\"")
.append(LINE_FEED);
mWriter.append("Content-Type: text/plain; charset=" + mCharset).append(
LINE_FEED);
mWriter.append(LINE_FEED);
mWriter.append(value).append(LINE_FEED);
mWriter.flush();
}
/**
* Adds a upload file section to the request
*
* @param fieldName name attribute in <input type="file" name="..." />
* @param uploadFile a File to be uploaded
* @param fileName the filename field
* @throws java.io.IOException
*/
public void addFilePart(String fieldName, File uploadFile, String fileName) throws IOException {
if (TextUtils.isEmpty(fileName)) {
fileName = uploadFile.getName();
}
mWriter.append("--" + mBoundary).append(LINE_FEED);
mWriter.append(
"Content-Disposition: form-data; name=\"" + fieldName
+ "\"; filename=\"" + fileName + "\"")
.append(LINE_FEED);
mWriter.append(
"Content-Type: " + URLConnection.guessContentTypeFromName(fileName))
.append(LINE_FEED);
mWriter.append("Content-Transfer-Encoding: binary").append(LINE_FEED);
mWriter.append(LINE_FEED);
mWriter.flush();
FileInputStream inputStream = new FileInputStream(uploadFile);
byte[] buffer = new byte[4096];
int bytesRead = -1;
while ((bytesRead = inputStream.read(buffer)) != -1) {
mOutputStream.write(buffer, 0, bytesRead);
}
mOutputStream.flush();
inputStream.close();
mWriter.append(LINE_FEED);
mWriter.flush();
}
}