/******************************************************************************
* Copyright (c) 2011 GitHub Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Kevin Sawicki (GitHub Inc.) - initial API and implementation
*****************************************************************************/
package org.eclipse.egit.github.core.util;
import static org.eclipse.egit.github.core.client.IGitHubConstants.CHARSET_UTF8;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Map;
import java.util.Map.Entry;
/**
* Utilities for writing multiple HTTP requests
*/
public class MultiPartUtils {
/**
* Post parts to URL
*
* @param url
* @param parts
* @return connection that was posted to
* @throws IOException
*/
public static HttpURLConnection post(String url, Map<String, Object> parts)
throws IOException {
HttpURLConnection post = (HttpURLConnection) new URL(url)
.openConnection();
post.setRequestMethod("POST"); //$NON-NLS-1$
return post(post, parts);
}
/**
* Post parts to connection
*
* @param post
* @param parts
* @return connection that was posted to
* @throws IOException
*/
public static HttpURLConnection post(HttpURLConnection post,
Map<String, Object> parts) throws IOException {
String boundary = "00content0boundary00"; //$NON-NLS-1$
post.setDoOutput(true);
post.setRequestProperty("Content-Type", //$NON-NLS-1$
"multipart/form-data; boundary=" + boundary); //$NON-NLS-1$
BufferedOutputStream output = new BufferedOutputStream(
post.getOutputStream());
byte[] buffer = new byte[8192];
byte[] boundarySeparator = ("--" + boundary + "\r\n") //$NON-NLS-1$ //$NON-NLS-2$
.getBytes(CHARSET_UTF8);
byte[] newline = "\r\n".getBytes(CHARSET_UTF8); //$NON-NLS-1$
try {
for (Entry<String, Object> part : parts.entrySet()) {
output.write(boundarySeparator);
StringBuilder partBuffer = new StringBuilder(
"Content-Disposition: "); //$NON-NLS-1$
partBuffer.append("form-data; name=\""); //$NON-NLS-1$
partBuffer.append(part.getKey());
partBuffer.append('"');
output.write(partBuffer.toString().getBytes(CHARSET_UTF8));
output.write(newline);
output.write(newline);
final Object value = part.getValue();
if (value instanceof InputStream) {
InputStream input = (InputStream) value;
int read;
while ((read = input.read(buffer)) != -1)
output.write(buffer, 0, read);
input.close();
} else
output.write(part.getValue().toString()
.getBytes(CHARSET_UTF8));
output.write(newline);
}
output.write(("--" + boundary + "--\r\n").getBytes(CHARSET_UTF8)); //$NON-NLS-1$ //$NON-NLS-2$
} finally {
output.close();
}
return post;
}
}