Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4ca0ff22 authored by masensio's avatar masensio
Browse files

Parse error 500 and InvalidPathException for Uploads

parent b8a3eb05
Loading
Loading
Loading
Loading
+5 −3
Original line number Diff line number Diff line
@@ -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);


	}
+23 −2
Original line number Diff line number Diff line
@@ -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;
            }
+23 −4
Original line number Diff line number Diff line
@@ -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<OnDatatransferProgressListener> mDataTransferListeners = new HashSet<OnDatatransferProgressListener>();
@@ -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 {