import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
+import java.net.ProtocolException;
import java.net.URL;
import java.nio.ByteBuffer;
import java.nio.channels.ReadableByteChannel;
import java.nio.channels.WritableByteChannel;
+import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ExecutorService;
private int mContentLength;
+ private int mUploadContentLength;
+
private long mContentLengthLimit;
private boolean mCancelIfContentLengthOverLimit;
private boolean mCanceled;
+ private String mMethod;
+
private InputStream mResponseStream;
private final Object mLock;
@Override
public void setUploadChannel(String contentType,
- ReadableByteChannel channel) {
+ ReadableByteChannel channel, long contentLength) {
validateNotStarted();
+ if (contentLength > Integer.MAX_VALUE) {
+ throw new IllegalArgumentException(
+ "Upload contentLength is too big.");
+ }
+ mUploadContentLength = (int)contentLength;
mPostContentType = contentType;
mPostDataChannel = channel;
mPostData = null;
}
+
+ @Override
+ public void setHttpMethod(String method) {
+ validateNotStarted();
+ if (!("PUT".equals(method) || "POST".equals(method))) {
+ throw new IllegalArgumentException(
+ "Only PUT and POST are allowed.");
+ }
+ mMethod = method;
+ }
+
@Override
public void start() {
getExecutor().execute(new Runnable() {
URL url = new URL(mUrl);
mConnection = (HttpURLConnection)url.openConnection();
+ // If configured, use the provided http verb.
+ if (mMethod != null) {
+ try {
+ mConnection.setRequestMethod(mMethod);
+ } catch (ProtocolException e) {
+ // Since request hasn't started earlier, it
+ // must be an illegal HTTP verb.
+ throw new IllegalArgumentException(e);
+ }
+ }
mConnection.setConnectTimeout(CONNECT_TIMEOUT);
mConnection.setReadTimeout(READ_TIMEOUT);
mConnection.setInstanceFollowRedirects(true);
uploadStream = mConnection.getOutputStream();
uploadStream.write(mPostData);
} else {
- mConnection.setChunkedStreamingMode(MAX_CHUNK_SIZE);
+ mConnection.setFixedLengthStreamingMode(mUploadContentLength);
uploadStream = mConnection.getOutputStream();
byte[] bytes = new byte[MAX_CHUNK_SIZE];
ByteBuffer byteBuffer = ByteBuffer.wrap(bytes);
return mContentType;
}
-
@Override
public String getHeader(String name) {
if (mConnection == null) {
throw new IllegalStateException("Response headers not available");
}
- return mConnection.getHeaderField(name);
+ Map<String, List<String>> headerFields = mConnection.getHeaderFields();
+ if (headerFields != null) {
+ List<String> headerValues = headerFields.get(name);
+ if (headerValues != null) {
+ return TextUtils.join(", ", headerValues);
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public Map<String, List<String>> getAllHeaders() {
+ if (mConnection == null) {
+ throw new IllegalStateException("Response headers not available");
+ }
+ return mConnection.getHeaderFields();
}
private void validateNotStarted() {