1
0
mirror of https://github.com/owncloud/android-library.git synced 2025-06-08 16:36:13 +00:00

Parse error 500 and InvalidPathException for Uploads

This commit is contained in:
masensio 2015-06-03 11:09:58 +02:00
parent b8a3eb059c
commit 4ca0ff2203
3 changed files with 51 additions and 9 deletions

View File

@ -35,11 +35,12 @@ import java.io.InputStream;
/** /**
* Parser for Invalid Character server exception * Parser for Invalid Character server exception
* @author masensio on 02/06/2015. * @author masensio
*/ */
public class InvalidCharacterExceptionParser { public class InvalidCharacterExceptionParser {
private static final String EXCEPTION_STRING = "OC\\Connector\\Sabre\\Exception\\InvalidPath"; private static final String EXCEPTION_STRING = "OC\\Connector\\Sabre\\Exception\\InvalidPath";
private static final String EXCEPTION_UPLOAD_STRING = "OCP\\Files\\InvalidPathException";
// No namespaces // No namespaces
private static final String ns = null; 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_ERROR = "d:error";
private static final String NODE_EXCEPTION = "s:exception"; private static final String NODE_EXCEPTION = "s:exception";
/** /**
* Parse is as response of Share API * Parse is as an Invalid Path Exception
* @param is * @param is
* @return if The exception is an Invalid Char Exception * @return if The exception is an Invalid Char Exception
* @throws XmlPullParserException * @throws XmlPullParserException
@ -98,7 +99,8 @@ public class InvalidCharacterExceptionParser {
} }
} }
return exception.equalsIgnoreCase(EXCEPTION_STRING); return exception.equalsIgnoreCase(EXCEPTION_STRING) ||
exception.equalsIgnoreCase(EXCEPTION_UPLOAD_STRING);
} }

View File

@ -24,8 +24,10 @@
package com.owncloud.android.lib.resources.files; package com.owncloud.android.lib.resources.files;
import java.io.ByteArrayInputStream;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile; import java.io.RandomAccessFile;
import java.nio.channels.FileChannel; import java.nio.channels.FileChannel;
import java.util.Random; 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.ChunkFromFileChannelRequestEntity;
import com.owncloud.android.lib.common.network.ProgressiveDataTransferer; import com.owncloud.android.lib.common.network.ProgressiveDataTransferer;
import com.owncloud.android.lib.common.network.WebdavUtils; 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; import com.owncloud.android.lib.common.utils.Log_OC;
@ -83,9 +87,26 @@ public class ChunkedUploadRemoteFileOperation extends UploadRemoteFileOperation
((ChunkFromFileChannelRequestEntity) mEntity).setOffset(offset); ((ChunkFromFileChannelRequestEntity) mEntity).setOffset(offset);
mPutMethod.setRequestEntity(mEntity); mPutMethod.setRequestEntity(mEntity);
status = client.executeMethod(mPutMethod); 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()); client.exhaustResponse(mPutMethod.getResponseBodyAsStream());
Log_OC.d(TAG, "Upload of " + mLocalPath + " to " + mRemotePath + ", chunk index " + Log_OC.d(TAG, "Upload of " + mLocalPath + " to " + mRemotePath +
chunkIndex + ", count " + chunkCount + ", HTTP result status " + status); ", chunk index " + chunkIndex + ", count " + chunkCount +
", HTTP result status " + status);
if (!isSuccess(status)) if (!isSuccess(status))
break; break;
} }

View File

@ -24,8 +24,10 @@
package com.owncloud.android.lib.resources.files; package com.owncloud.android.lib.resources.files;
import java.io.ByteArrayInputStream;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean; 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.OnDatatransferProgressListener;
import com.owncloud.android.lib.common.network.ProgressiveDataTransferer; import com.owncloud.android.lib.common.network.ProgressiveDataTransferer;
import com.owncloud.android.lib.common.network.WebdavUtils; 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.OperationCancelledException;
import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperation;
import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.operations.RemoteOperationResult;
@ -62,6 +65,7 @@ public class UploadRemoteFileOperation extends RemoteOperation {
protected String mRemotePath; protected String mRemotePath;
protected String mMimeType; protected String mMimeType;
protected PutMethod mPutMethod = null; protected PutMethod mPutMethod = null;
protected boolean mForbiddenCharsInServer = false;
private final AtomicBoolean mCancellationRequested = new AtomicBoolean(false); private final AtomicBoolean mCancellationRequested = new AtomicBoolean(false);
protected Set<OnDatatransferProgressListener> mDataTransferListeners = new HashSet<OnDatatransferProgressListener>(); protected Set<OnDatatransferProgressListener> mDataTransferListeners = new HashSet<OnDatatransferProgressListener>();
@ -90,10 +94,10 @@ public class UploadRemoteFileOperation extends RemoteOperation {
} }
int status = uploadFile(client); int status = uploadFile(client);
if (status == 400) { // TODO: Detect INVALID_CHARACTER_DETECT_IN SERVER in a better way?
result = new RemoteOperationResult(isSuccess(status), if (mForbiddenCharsInServer){
mPutMethod.getResponseBodyAsString(), status); result = new RemoteOperationResult(
Log_OC.d(TAG, mPutMethod.getResponseBodyAsString()); RemoteOperationResult.ResultCode.INVALID_CHARACTER_DETECT_IN_SERVER);
} else { } else {
result = new RemoteOperationResult(isSuccess(status), status, result = new RemoteOperationResult(isSuccess(status), status,
(mPutMethod != null ? mPutMethod.getResponseHeaders() : null)); (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.addRequestHeader(OC_TOTAL_LENGTH_HEADER, String.valueOf(f.length()));
mPutMethod.setRequestEntity(mEntity); mPutMethod.setRequestEntity(mEntity);
status = client.executeMethod(mPutMethod); 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()); client.exhaustResponse(mPutMethod.getResponseBodyAsStream());
} finally { } finally {