From 4ca0ff2203a84173dca984632a1131170a169f08 Mon Sep 17 00:00:00 2001 From: masensio Date: Wed, 3 Jun 2015 11:09:58 +0200 Subject: [PATCH] Parse error 500 and InvalidPathException for Uploads --- .../InvalidCharacterExceptionParser.java | 8 +++--- .../ChunkedUploadRemoteFileOperation.java | 25 +++++++++++++++-- .../files/UploadRemoteFileOperation.java | 27 ++++++++++++++++--- 3 files changed, 51 insertions(+), 9 deletions(-) diff --git a/src/com/owncloud/android/lib/common/operations/InvalidCharacterExceptionParser.java b/src/com/owncloud/android/lib/common/operations/InvalidCharacterExceptionParser.java index 7f72efe9..63d28319 100644 --- a/src/com/owncloud/android/lib/common/operations/InvalidCharacterExceptionParser.java +++ b/src/com/owncloud/android/lib/common/operations/InvalidCharacterExceptionParser.java @@ -35,11 +35,12 @@ import java.io.InputStream; /** * Parser for Invalid Character server exception - * @author masensio on 02/06/2015. + * @author masensio */ public class InvalidCharacterExceptionParser { private static final String EXCEPTION_STRING = "OC\\Connector\\Sabre\\Exception\\InvalidPath"; + private static final String EXCEPTION_UPLOAD_STRING = "OCP\\Files\\InvalidPathException"; // No namespaces private static final String ns = null; @@ -48,7 +49,7 @@ public class InvalidCharacterExceptionParser { private static final String NODE_ERROR = "d:error"; private static final String NODE_EXCEPTION = "s:exception"; /** - * Parse is as response of Share API + * Parse is as an Invalid Path Exception * @param is * @return if The exception is an Invalid Char Exception * @throws XmlPullParserException @@ -98,7 +99,8 @@ public class InvalidCharacterExceptionParser { } } - return exception.equalsIgnoreCase(EXCEPTION_STRING); + return exception.equalsIgnoreCase(EXCEPTION_STRING) || + exception.equalsIgnoreCase(EXCEPTION_UPLOAD_STRING); } diff --git a/src/com/owncloud/android/lib/resources/files/ChunkedUploadRemoteFileOperation.java b/src/com/owncloud/android/lib/resources/files/ChunkedUploadRemoteFileOperation.java index 1ae71bd8..7ab9e2d8 100644 --- a/src/com/owncloud/android/lib/resources/files/ChunkedUploadRemoteFileOperation.java +++ b/src/com/owncloud/android/lib/resources/files/ChunkedUploadRemoteFileOperation.java @@ -24,8 +24,10 @@ package com.owncloud.android.lib.resources.files; +import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; +import java.io.InputStream; import java.io.RandomAccessFile; import java.nio.channels.FileChannel; import java.util.Random; @@ -37,6 +39,8 @@ import com.owncloud.android.lib.common.OwnCloudClient; import com.owncloud.android.lib.common.network.ChunkFromFileChannelRequestEntity; import com.owncloud.android.lib.common.network.ProgressiveDataTransferer; import com.owncloud.android.lib.common.network.WebdavUtils; +import com.owncloud.android.lib.common.operations.InvalidCharacterExceptionParser; +import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.utils.Log_OC; @@ -83,9 +87,26 @@ public class ChunkedUploadRemoteFileOperation extends UploadRemoteFileOperation ((ChunkFromFileChannelRequestEntity) mEntity).setOffset(offset); mPutMethod.setRequestEntity(mEntity); status = client.executeMethod(mPutMethod); + + // TODO: Detect INVALID_CHARACTER_DETECT_IN SERVER in a better way? + if (status == 400 || status == 500) { + InvalidCharacterExceptionParser xmlParser = new InvalidCharacterExceptionParser(); + InputStream is = new ByteArrayInputStream( + mPutMethod.getResponseBodyAsString().getBytes()); + try { + mForbiddenCharsInServer = xmlParser.parseXMLResponse(is); + + } catch (Exception e) { + mForbiddenCharsInServer = false; + Log_OC.e(TAG, "Exception reading exception from server", e); + } + } + client.exhaustResponse(mPutMethod.getResponseBodyAsStream()); - Log_OC.d(TAG, "Upload of " + mLocalPath + " to " + mRemotePath + ", chunk index " + - chunkIndex + ", count " + chunkCount + ", HTTP result status " + status); + Log_OC.d(TAG, "Upload of " + mLocalPath + " to " + mRemotePath + + ", chunk index " + chunkIndex + ", count " + chunkCount + + ", HTTP result status " + status); + if (!isSuccess(status)) break; } diff --git a/src/com/owncloud/android/lib/resources/files/UploadRemoteFileOperation.java b/src/com/owncloud/android/lib/resources/files/UploadRemoteFileOperation.java index e3b2ff63..9fcd6515 100644 --- a/src/com/owncloud/android/lib/resources/files/UploadRemoteFileOperation.java +++ b/src/com/owncloud/android/lib/resources/files/UploadRemoteFileOperation.java @@ -24,8 +24,10 @@ package com.owncloud.android.lib.resources.files; +import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; +import java.io.InputStream; import java.util.HashSet; import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; @@ -40,6 +42,7 @@ import com.owncloud.android.lib.common.network.FileRequestEntity; import com.owncloud.android.lib.common.network.OnDatatransferProgressListener; import com.owncloud.android.lib.common.network.ProgressiveDataTransferer; import com.owncloud.android.lib.common.network.WebdavUtils; +import com.owncloud.android.lib.common.operations.InvalidCharacterExceptionParser; import com.owncloud.android.lib.common.operations.OperationCancelledException; import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperationResult; @@ -62,6 +65,7 @@ public class UploadRemoteFileOperation extends RemoteOperation { protected String mRemotePath; protected String mMimeType; protected PutMethod mPutMethod = null; + protected boolean mForbiddenCharsInServer = false; private final AtomicBoolean mCancellationRequested = new AtomicBoolean(false); protected Set mDataTransferListeners = new HashSet(); @@ -90,10 +94,10 @@ public class UploadRemoteFileOperation extends RemoteOperation { } int status = uploadFile(client); - if (status == 400) { - result = new RemoteOperationResult(isSuccess(status), - mPutMethod.getResponseBodyAsString(), status); - Log_OC.d(TAG, mPutMethod.getResponseBodyAsString()); + // TODO: Detect INVALID_CHARACTER_DETECT_IN SERVER in a better way? + if (mForbiddenCharsInServer){ + result = new RemoteOperationResult( + RemoteOperationResult.ResultCode.INVALID_CHARACTER_DETECT_IN_SERVER); } else { result = new RemoteOperationResult(isSuccess(status), status, (mPutMethod != null ? mPutMethod.getResponseHeaders() : null)); @@ -127,6 +131,21 @@ public class UploadRemoteFileOperation extends RemoteOperation { mPutMethod.addRequestHeader(OC_TOTAL_LENGTH_HEADER, String.valueOf(f.length())); mPutMethod.setRequestEntity(mEntity); status = client.executeMethod(mPutMethod); + + // TODO: Detect INVALID_CHARACTER_DETECT_IN SERVER in a better way? + if (status == 400 || status == 500) { + InvalidCharacterExceptionParser xmlParser = new InvalidCharacterExceptionParser(); + InputStream is = new ByteArrayInputStream( + mPutMethod.getResponseBodyAsString().getBytes()); + try { + mForbiddenCharsInServer = xmlParser.parseXMLResponse(is); + + } catch (Exception e) { + mForbiddenCharsInServer = false; + Log_OC.e(TAG, "Exception reading exception from server", e); + } + } + client.exhaustResponse(mPutMethod.getResponseBodyAsStream()); } finally {