2016-10-10 15:55:27 +10:30

98 lines
3.0 KiB
Java

package org.servalproject.servaldna;
import org.servalproject.servaldna.rhizome.RhizomeIncompleteManifest;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.HttpURLConnection;
/**
* Created by jeremy on 5/10/16.
*/
public class PostHelper {
private HttpURLConnection conn;
private String boundary;
private OutputStream output;
private PrintStream writer;
public PostHelper(HttpURLConnection conn) {
this.conn = conn;
boundary = Long.toHexString(System.currentTimeMillis());
}
public void connect() throws IOException {
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
conn.connect();
output = conn.getOutputStream();
writer = new PrintStream(output, false, "UTF-8");
}
private void quoteString(StringBuilder sb, String unquoted)
{
if (unquoted == null) {
sb.append("null");
return;
}
sb.append('"');
for (int i = 0; i < unquoted.length(); ++i) {
char c = unquoted.charAt(i);
if (c == '"' || c == '\\')
sb.append('\\');
sb.append(c);
}
sb.append('"');
}
public void writeHeading(String name, String filename, String type, String encoding)
{
StringBuilder sb = new StringBuilder();
sb.append("\r\n--").append(boundary).append("\r\n");
sb.append("Content-Disposition: form-data; name=");
quoteString(sb, name);
if (filename!=null) {
sb.append("; filename=");
quoteString(sb, filename);
}
sb.append("\r\n");
sb.append("Content-Type: ").append(type).append("\r\n");
if (encoding!=null)
sb.append("Content-Transfer-Encoding: ").append(encoding).append("\r\n");
sb.append("\r\n");
writer.print(sb.toString());
}
public void writeField(String name, String value){
writeHeading(name, null, "text/plain; charset=utf-8", null);
writer.print(value);
}
public void writeField(String name, AbstractId value){
writeHeading(name, null, value.getMimeType(), "hex");
writer.print(value.toHex());
}
public void writeField(String name, String filename, InputStream stream) throws IOException {
writeHeading(name, filename, "application/octet-stream", "binary");
writer.flush();
byte[] buffer = new byte[4096];
int n;
while ((n = stream.read(buffer)) > 0)
output.write(buffer, 0, n);
}
public void writeField(String name, RhizomeIncompleteManifest manifest) throws IOException {
writeHeading(name, null, "rhizome/manifest; format=\"text+binarysig\"", "binary");
manifest.toTextFormat(writer);
}
public void close(){
writer.print("\r\n--" + boundary + "--\r\n");
writer.flush();
writer.close();
}
}