package tim.prune.function.gpsies;
import java.net.HttpURLConnection;
import java.net.URLConnection;
import java.net.URL;
import java.io.IOException;
import java.io.InputStream;
import java.util.Random;
import java.io.OutputStream;
/**
* Taken from the Client HTTP Request class at com.myjavatools.web
* and subsequently simplified and modified
* @author Vlad Patryshev
*/
public class FormPoster
{
private URLConnection _connection = null;
private OutputStream _os = null;
private static final Random RANDOM_GEN = new Random();
private static final String BOUNDARY = "---------------------------"
+ randomString() + randomString() + randomString();
/** Connect (if not already connected) */
protected void connect() throws IOException {
if (_os == null) _os = _connection.getOutputStream();
}
/** Write a single character */
protected void write(char c) throws IOException {
connect();
_os.write(c);
}
/** Write a string */
protected void write(String s) throws IOException {
connect();
_os.write(s.getBytes());
}
/** Write a -r-n newline sequence */
protected void newline() throws IOException {
write("\r\n");
}
/** Write a string followed by a newline */
protected void writeln(String s) throws IOException {
write(s);
newline();
}
/** Generate a random alphanumeric string */
private static String randomString() {
return Long.toString(RANDOM_GEN.nextLong(), 36);
}
/** Write a boundary marker */
private void boundary() throws IOException {
write("--");
write(BOUNDARY);
}
/**
* Creates a new multipart POST HTTP request for a specified URL
* @param url the URL to send request to
* @throws IOException
*/
public FormPoster(URL inUrl) throws IOException
{
_connection = inUrl.openConnection();
_connection.setDoOutput(true);
_connection.setRequestProperty("Content-Type",
"multipart/form-data; boundary=" + BOUNDARY);
}
/** Write a header with the given name */
private void writeName(String inName) throws IOException
{
newline();
write("Content-Disposition: form-data; name=\"");
write(inName);
write('"');
}
/**
* adds a string parameter to the request
* @param name parameter name
* @param value parameter value
* @throws IOException
*/
public void setParameter(String inName, String inValue) throws IOException
{
boundary();
writeName(inName);
newline(); newline();
writeln(inValue);
}
/** Pipe the contents of the input stream to the output stream */
private static void pipe(InputStream in, OutputStream out) throws IOException
{
byte[] buf = new byte[500000];
int nread;
synchronized (in) {
while((nread = in.read(buf, 0, buf.length)) >= 0) {
out.write(buf, 0, nread);
}
}
out.flush();
buf = null;
}
/**
* adds a file parameter to the request
* @param inName parameter name
* @param inFilename the name of the file
* @param inStream input stream to read the contents of the file from
* @throws IOException
*/
public void setParameter(String inName, String inFilename, InputStream inStream) throws IOException
{
boundary();
writeName(inName);
write("; filename=\"");
write(inFilename);
write('"');
newline();
write("Content-Type: ");
String type = URLConnection.guessContentTypeFromName(inFilename);
if (type == null) {type = "application/octet-stream";}
writeln(type);
newline();
pipe(inStream, _os);
newline();
}
/**
* posts the requests to the server
* @return input stream with the server response
* @throws IOException
*/
public InputStream post() throws IOException
{
boundary();
writeln("--");
_os.close();
return _connection.getInputStream();
}
/**
* @return the HTTP response code, 200 for success or -1 if not available
*/
public int getResponseCode() throws IOException
{
if (_connection != null && _connection instanceof HttpURLConnection) {
return ((HttpURLConnection) _connection).getResponseCode();
}
return -1;
}
}