package com.example.client.request;
import com.example.client.parser.MultipartParser;
import com.example.client.response.Response;
import com.example.entity.MultipartEntity;
import org.codehaus.jackson.JsonParseException;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
public class MultipartRequest extends Request
{
private static final String REQUEST_METHOD = "POST";
private static final String REQUEST_PATH = "multipart";
private String mTextData1;
private String mTextData2;
private byte[] mBinaryData1;
private byte[] mBinaryData2;
public MultipartRequest(String textData1, String textData2, byte[] binaryData1, byte[] binaryData2)
{
mTextData1 = textData1;
mTextData2 = textData2;
mBinaryData1 = binaryData1;
mBinaryData2 = binaryData2;
}
@Override
public String getRequestMethod()
{
return REQUEST_METHOD;
}
@Override
public String getAddress()
{
StringBuilder builder = new StringBuilder();
// url
builder.append(REST_BASE_URL);
builder.append(REQUEST_PATH);
return builder.toString();
}
@Override
public Response<MultipartEntity> parseResponse(InputStream stream) throws IOException, JsonParseException
{
return MultipartParser.parse(stream);
}
@Override
public byte[] getContent()
{
StringBuilder plainBuilder = new StringBuilder();
plainBuilder.append("--" + BOUNDARY + "\r\n");
plainBuilder.append("Content-Disposition: form-data; name=\"text1\"\r\n");
plainBuilder.append("Content-Type: text/plain; charset=utf-8\r\n");
plainBuilder.append("\r\n");
plainBuilder.append(mTextData1);
plainBuilder.append("\r\n");
plainBuilder.append("--" + BOUNDARY + "\r\n");
plainBuilder.append("Content-Disposition: form-data; name=\"text2\"\r\n");
plainBuilder.append("Content-Type: text/plain; charset=utf-8\r\n");
plainBuilder.append("\r\n");
plainBuilder.append(mTextData2);
plainBuilder.append("\r\n");
StringBuilder binary1Builder = new StringBuilder();
binary1Builder.append("--" + BOUNDARY + "\r\n");
binary1Builder.append("Content-Disposition: form-data; name=\"binary1\"; filename=\"file.data\"\r\n");
binary1Builder.append("Content-Type: application/octet-stream\r\n");
binary1Builder.append("\r\n");
StringBuilder binary2Builder = new StringBuilder();
binary2Builder.append("--" + BOUNDARY + "\r\n");
binary2Builder.append("Content-Disposition: form-data; name=\"binary2\"; filename=\"file.data\"\r\n");
binary2Builder.append("Content-Type: application/octet-stream\r\n");
binary2Builder.append("\r\n");
try
{
byte[] plainBytes = plainBuilder.toString().getBytes("UTF-8");
byte[] binary1Bytes = binary1Builder.toString().getBytes("UTF-8");
byte[] binary2Bytes = binary2Builder.toString().getBytes("UTF-8");
byte[] breakBytes = "\r\n".getBytes("UTF-8");
byte[] endBytes = ("--" + BOUNDARY + "--\r\n").getBytes("UTF-8");
// byte stream
ByteArrayOutputStream stream = new ByteArrayOutputStream();
stream.write(plainBytes);
if(mBinaryData1.length > 0)
{
stream.write(binary1Bytes);
stream.write(mBinaryData1);
stream.write(breakBytes);
}
if(mBinaryData2.length > 0)
{
stream.write(binary2Bytes);
stream.write(mBinaryData2);
stream.write(breakBytes);
}
stream.write(endBytes);
return stream.toByteArray();
}
catch(UnsupportedEncodingException e)
{
e.printStackTrace();
return null;
}
catch(IOException e)
{
e.printStackTrace();
return null;
}
}
// TODO: set proper content type in APICall
@Override
public boolean isMultipart()
{
return true;
}
}