Avoid crash in the login page when the connections is tested, then changed to other...
[pub/Android/ownCloud.git] / src / eu / alefzero / webdav / WebdavClient.java
index 9eafddc..a539800 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
@@ -96,7 +97,7 @@ public class WebdavClient extends HttpClient {
     }\r
 \r
     public void setCredentials(String username, String password) {\r
-        //getParams().setAuthenticationPreemptive(true);\r
+        getParams().setAuthenticationPreemptive(true);\r
         getState().setCredentials(AuthScope.ANY,\r
                 getCredentials(username, password));\r
     }\r
@@ -122,16 +123,13 @@ public class WebdavClient extends HttpClient {
      */\r
     public boolean downloadFile(String remoteFilepath, File targetPath) {\r
         boolean ret = false;\r
-        GetMethod get = new GetMethod(mUri.toString() + WebdavUtils.encode(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
+        GetMethod get = new GetMethod(mUri.toString() + WebdavUtils.encodePath(remoteFilepath));\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
@@ -146,9 +144,9 @@ public class WebdavClient extends HttpClient {
                         mDataTransferListener.transferProgress(readResult);\r
                     fos.write(bytes, 0, readResult);\r
                 }\r
-                \r
+                ret = true;\r
             }\r
-            ret = true;\r
+            \r
         } catch (Throwable e) {\r
             e.printStackTrace();\r
             targetPath.delete();\r
@@ -163,7 +161,7 @@ public class WebdavClient extends HttpClient {
      * @return\r
      */\r
     public boolean deleteFile(String remoteFilePath){\r
-        DavMethod delete = new DeleteMethod(mUri.toString() + WebdavUtils.encode(remoteFilePath));\r
+        DavMethod delete = new DeleteMethod(mUri.toString() + WebdavUtils.encodePath(remoteFilePath));\r
         try {\r
             executeMethod(delete);\r
         }  catch (Throwable e) {\r
@@ -196,13 +194,10 @@ public class WebdavClient extends HttpClient {
             FileRequestEntity entity = new FileRequestEntity(f, contentType);\r
             entity.setOnDatatransferProgressListener(mDataTransferListener);\r
             Log.e("ASD", f.exists() + " " + entity.getContentLength());\r
-            PutMethod put = new PutMethod(mUri.toString() + WebdavUtils.encode(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
+            PutMethod put = new PutMethod(mUri.toString() + WebdavUtils.encodePath(remoteTarget));\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
@@ -242,7 +237,7 @@ public class WebdavClient extends HttpClient {
      */\r
     public boolean createDirectory(String path) {\r
         try {\r
-            MkColMethod mkcol = new MkColMethod(mUri.toString() + WebdavUtils.encode(path));\r
+            MkColMethod mkcol = new MkColMethod(mUri.toString() + WebdavUtils.encodePath(path));\r
             int status = executeMethod(mkcol);\r
             Log.d(TAG, "Status returned " + status);\r
             Log.d(TAG, "uri: " + mkcol.getURI().toString());\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