Loading src/com/owncloud/android/lib/common/operations/InvalidCharacterExceptionParser.java +5 −3 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 Loading Loading @@ -98,7 +99,8 @@ public class InvalidCharacterExceptionParser { } } return exception.equalsIgnoreCase(EXCEPTION_STRING); return exception.equalsIgnoreCase(EXCEPTION_STRING) || exception.equalsIgnoreCase(EXCEPTION_UPLOAD_STRING); } Loading src/com/owncloud/android/lib/resources/files/ChunkedUploadRemoteFileOperation.java +23 −2 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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; } Loading src/com/owncloud/android/lib/resources/files/UploadRemoteFileOperation.java +23 −4 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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<OnDatatransferProgressListener> mDataTransferListeners = new HashSet<OnDatatransferProgressListener>(); Loading Loading @@ -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)); Loading Loading @@ -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 { Loading Loading
src/com/owncloud/android/lib/common/operations/InvalidCharacterExceptionParser.java +5 −3 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 Loading Loading @@ -98,7 +99,8 @@ public class InvalidCharacterExceptionParser { } } return exception.equalsIgnoreCase(EXCEPTION_STRING); return exception.equalsIgnoreCase(EXCEPTION_STRING) || exception.equalsIgnoreCase(EXCEPTION_UPLOAD_STRING); } Loading
src/com/owncloud/android/lib/resources/files/ChunkedUploadRemoteFileOperation.java +23 −2 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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; } Loading
src/com/owncloud/android/lib/resources/files/UploadRemoteFileOperation.java +23 −4 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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<OnDatatransferProgressListener> mDataTransferListeners = new HashSet<OnDatatransferProgressListener>(); Loading Loading @@ -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)); Loading Loading @@ -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 { Loading