Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / components / cronet / android / java / src / org / chromium / net / HttpUrlConnectionUrlRequest.java
index f6db95e..2bae943 100644 (file)
@@ -14,10 +14,12 @@ import java.io.IOException;
 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;
@@ -55,6 +57,8 @@ class HttpUrlConnectionUrlRequest implements HttpUrlRequest {
 
     private int mContentLength;
 
+    private int mUploadContentLength;
+
     private long mContentLengthLimit;
 
     private boolean mCancelIfContentLengthOverLimit;
@@ -79,6 +83,8 @@ class HttpUrlConnectionUrlRequest implements HttpUrlRequest {
 
     private boolean mCanceled;
 
+    private String mMethod;
+
     private InputStream mResponseStream;
 
     private final Object mLock;
@@ -160,13 +166,29 @@ class HttpUrlConnectionUrlRequest implements HttpUrlRequest {
 
     @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() {
@@ -188,6 +210,16 @@ class HttpUrlConnectionUrlRequest implements HttpUrlRequest {
 
             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);
@@ -290,7 +322,7 @@ class HttpUrlConnectionUrlRequest implements HttpUrlRequest {
                 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);
@@ -444,13 +476,27 @@ class HttpUrlConnectionUrlRequest implements HttpUrlRequest {
         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() {