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:
parent
b8a3eb059c
commit
4ca0ff2203
@ -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);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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 {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user