Added timeout to the connection test; timeoutted methods granted for HTTPS
[pub/Android/ownCloud.git] / src / eu / alefzero / webdav / WebdavClient.java
index e248eb8..44b6e6b 100644 (file)
@@ -24,7 +24,8 @@ import java.io.IOException;
 \r
 import org.apache.commons.httpclient.Credentials;\r
 import org.apache.commons.httpclient.HttpClient;\r
-import org.apache.commons.httpclient.HttpConnectionManager;\r
+import org.apache.commons.httpclient.HttpException;\r
+import org.apache.commons.httpclient.HttpMethodBase;\r
 import org.apache.commons.httpclient.HttpVersion;\r
 import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;\r
 import org.apache.commons.httpclient.UsernamePasswordCredentials;\r
@@ -123,15 +124,12 @@ public class WebdavClient extends HttpClient {
     public boolean downloadFile(String remoteFilepath, File targetPath) {\r
         boolean ret = false;\r
         GetMethod get = new GetMethod(mUri.toString() + WebdavUtils.encodePath(remoteFilepath));\r
-        HttpMethodParams params = get.getParams();\r
-        params.setSoTimeout(0); // that means "infinite timeout"; it's the default value, but let's make it explicit\r
-        get.setParams(params);\r
 \r
         // get.setHeader("Host", mUri.getHost());\r
         // get.setHeader("User-Agent", "Android-ownCloud");\r
 \r
         try {\r
-            int status = executeMethod(get);\r
+            int status = executeMethod(get, 0);\r
             Log.e(TAG, "status return: " + status);\r
             if (status == HttpStatus.SC_OK) {\r
                 targetPath.createNewFile();\r
@@ -197,12 +195,9 @@ public class WebdavClient extends HttpClient {
             entity.setOnDatatransferProgressListener(mDataTransferListener);\r
             Log.e("ASD", f.exists() + " " + entity.getContentLength());\r
             PutMethod put = new PutMethod(mUri.toString() + WebdavUtils.encodePath(remoteTarget));\r
-            HttpMethodParams params = put.getParams();\r
-            params.setSoTimeout(0); // that means "infinite timeout"; it's the default value, but let's make it explicit\r
-            put.setParams(params);\r
             put.setRequestEntity(entity);\r
             Log.d(TAG, "" + put.getURI().toString());\r
-            int status = executeMethod(put);\r
+            int status = executeMethod(put, 0);\r
             Log.d(TAG, "PUT method return with status " + status);\r
 \r
             Log.i(TAG, "Uploading, done");\r
@@ -253,4 +248,31 @@ public class WebdavClient extends HttpClient {
         }\r
         return true;\r
     }\r
+\r
+\r
+    /**\r
+     * Requests the received method with the received timeout (milliseconds).\r
+     * \r
+     * Executes the method through the inherited HttpClient.executedMethod(method).\r
+     * \r
+     * Sets the socket timeout for the HttpMethodBase method received.\r
+     * \r
+     * @param method    HTTP method request.\r
+     * @param timeout   Timeout to set, in milliseconds; <= 0 means infinite.\r
+     */\r
+    public int executeMethod(HttpMethodBase method, int readTimeout) throws HttpException, IOException {\r
+        int oldSoTimeout = getParams().getSoTimeout();\r
+        try {\r
+            if (readTimeout < 0) { \r
+                readTimeout = 0;\r
+            }\r
+            HttpMethodParams params = method.getParams();\r
+            params.setSoTimeout(readTimeout);       \r
+            method.setParams(params);               // this should be enough...\r
+            getParams().setSoTimeout(readTimeout);  // ... but this is necessary for HTTPS\r
+            return executeMethod(method);\r
+        } finally {\r
+            getParams().setSoTimeout(oldSoTimeout);\r
+        }\r
+    }\r
 }\r