mirror of
https://github.com/owncloud/android-library.git
synced 2026-08-17 03:12:54 +00:00
Keep http phrase in RemoteOperationResult as last chance for a detailed user message
This commit is contained in:
@@ -45,6 +45,7 @@ import com.owncloud.android.lib.common.utils.Log_OC;
|
||||
import org.apache.commons.httpclient.ConnectTimeoutException;
|
||||
import org.apache.commons.httpclient.Header;
|
||||
import org.apache.commons.httpclient.HttpException;
|
||||
import org.apache.commons.httpclient.HttpMethod;
|
||||
import org.apache.commons.httpclient.HttpStatus;
|
||||
import org.apache.jackrabbit.webdav.DavException;
|
||||
import org.json.JSONException;
|
||||
@@ -63,9 +64,8 @@ import javax.net.ssl.SSLException;
|
||||
public class RemoteOperationResult implements Serializable {
|
||||
|
||||
/** Generated - should be refreshed every time the class changes!! */
|
||||
;
|
||||
|
||||
private static final long serialVersionUID = -1909603208238358633L;
|
||||
private static final long serialVersionUID = 4968939884332372230L;
|
||||
|
||||
private static final String TAG = RemoteOperationResult.class.getSimpleName();
|
||||
|
||||
public enum ResultCode {
|
||||
@@ -120,6 +120,7 @@ public class RemoteOperationResult implements Serializable {
|
||||
|
||||
private boolean mSuccess = false;
|
||||
private int mHttpCode = -1;
|
||||
private String mHttpPhrase = null;
|
||||
private Exception mException = null;
|
||||
private ResultCode mCode = ResultCode.UNKNOWN_ERROR;
|
||||
private String mRedirectedLocation;
|
||||
@@ -128,6 +129,13 @@ public class RemoteOperationResult implements Serializable {
|
||||
|
||||
private ArrayList<Object> mData;
|
||||
|
||||
/**
|
||||
* Public constructor from result code.
|
||||
*
|
||||
* To be used when the caller takes the responsibility of interpreting the result of a {@link RemoteOperation}
|
||||
*
|
||||
* @param code {@link ResultCode} decided by the caller.
|
||||
*/
|
||||
public RemoteOperationResult(ResultCode code) {
|
||||
mCode = code;
|
||||
mSuccess = (code == ResultCode.OK || code == ResultCode.OK_SSL ||
|
||||
@@ -136,96 +144,15 @@ public class RemoteOperationResult implements Serializable {
|
||||
mData = null;
|
||||
}
|
||||
|
||||
private RemoteOperationResult(boolean success, int httpCode) {
|
||||
mSuccess = success;
|
||||
mHttpCode = httpCode;
|
||||
|
||||
if (success) {
|
||||
mCode = ResultCode.OK;
|
||||
|
||||
} else if (httpCode > 0) {
|
||||
switch (httpCode) {
|
||||
case HttpStatus.SC_UNAUTHORIZED:
|
||||
mCode = ResultCode.UNAUTHORIZED;
|
||||
break;
|
||||
case HttpStatus.SC_NOT_FOUND:
|
||||
mCode = ResultCode.FILE_NOT_FOUND;
|
||||
break;
|
||||
case HttpStatus.SC_INTERNAL_SERVER_ERROR:
|
||||
mCode = ResultCode.INSTANCE_NOT_CONFIGURED;
|
||||
break;
|
||||
case HttpStatus.SC_CONFLICT:
|
||||
mCode = ResultCode.CONFLICT;
|
||||
break;
|
||||
case HttpStatus.SC_INSUFFICIENT_STORAGE:
|
||||
mCode = ResultCode.QUOTA_EXCEEDED;
|
||||
break;
|
||||
case HttpStatus.SC_FORBIDDEN:
|
||||
mCode = ResultCode.FORBIDDEN;
|
||||
break;
|
||||
case HttpStatus.SC_SERVICE_UNAVAILABLE:
|
||||
mCode = ResultCode.MAINTENANCE_MODE;
|
||||
break;
|
||||
default:
|
||||
mCode = ResultCode.UNHANDLED_HTTP_CODE;
|
||||
Log_OC.d(TAG, "RemoteOperationResult has processed UNHANDLED_HTTP_CODE: " +
|
||||
httpCode);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public RemoteOperationResult(boolean success, int httpCode, Header[] headers) {
|
||||
this(success, httpCode);
|
||||
if (headers != null) {
|
||||
Header current;
|
||||
for (int i = 0; i < headers.length; i++) {
|
||||
current = headers[i];
|
||||
if ("location".equals(current.getName().toLowerCase())) {
|
||||
mRedirectedLocation = current.getValue();
|
||||
continue;
|
||||
}
|
||||
if ("www-authenticate".equals(current.getName().toLowerCase())) {
|
||||
mAuthenticate = current.getValue();
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (isIdPRedirection()) {
|
||||
mCode = ResultCode.UNAUTHORIZED; // overrides default ResultCode.UNKNOWN
|
||||
}
|
||||
}
|
||||
|
||||
public RemoteOperationResult(boolean success, String bodyResponse, int httpCode) {
|
||||
mSuccess = success;
|
||||
mHttpCode = httpCode;
|
||||
|
||||
if (success) {
|
||||
mCode = ResultCode.OK;
|
||||
|
||||
} else if (httpCode > 0) {
|
||||
switch (httpCode) {
|
||||
case HttpStatus.SC_BAD_REQUEST:
|
||||
|
||||
InputStream is = new ByteArrayInputStream(bodyResponse.getBytes());
|
||||
InvalidCharacterExceptionParser xmlParser = new InvalidCharacterExceptionParser();
|
||||
try {
|
||||
if (xmlParser.parseXMLResponse(is))
|
||||
mCode = ResultCode.INVALID_CHARACTER_DETECT_IN_SERVER;
|
||||
|
||||
} catch (Exception e) {
|
||||
mCode = ResultCode.UNHANDLED_HTTP_CODE;
|
||||
Log_OC.e(TAG, "Exception reading exception from server", e);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
mCode = ResultCode.UNHANDLED_HTTP_CODE;
|
||||
Log_OC.d(TAG, "RemoteOperationResult has processed UNHANDLED_HTTP_CODE: " +
|
||||
httpCode);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Public constructor from exception.
|
||||
*
|
||||
* To be used when an exception prevented the end of the {@link RemoteOperation}.
|
||||
*
|
||||
* Determines a {@link ResultCode} depending on the type of the exception.
|
||||
*
|
||||
* @param e Exception that interrupted the {@link RemoteOperation}
|
||||
*/
|
||||
public RemoteOperationResult(Exception e) {
|
||||
mException = e;
|
||||
|
||||
@@ -276,6 +203,133 @@ public class RemoteOperationResult implements Serializable {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Public constructor from separate elements of an HTTP or DAV response.
|
||||
*
|
||||
* To be used when the result needs to be interpreted from the response of an HTTP/DAV method.
|
||||
*
|
||||
* Determines a {@link ResultCode} from the already executed method received as a parameter. Generally,
|
||||
* will depend on the HTTP code and HTTP response headers received. In some cases will inspect also the
|
||||
* response body.
|
||||
*
|
||||
* @param success The operation was considered successful or not.
|
||||
* @param httpMethod HTTP/DAV method already executed which response will be examined to interpret the
|
||||
* result.
|
||||
*/
|
||||
public RemoteOperationResult(boolean success, HttpMethod httpMethod) throws IOException {
|
||||
this(
|
||||
success,
|
||||
httpMethod.getStatusCode(),
|
||||
httpMethod.getStatusText(),
|
||||
httpMethod.getResponseHeaders()
|
||||
);
|
||||
|
||||
if (mHttpCode == HttpStatus.SC_BAD_REQUEST) { // 400
|
||||
String bodyResponse = httpMethod.getResponseBodyAsString();
|
||||
// do not get for other HTTP codes!; could not be available
|
||||
|
||||
if (bodyResponse != null && bodyResponse.length() > 0) {
|
||||
InputStream is = new ByteArrayInputStream(bodyResponse.getBytes());
|
||||
InvalidCharacterExceptionParser xmlParser = new InvalidCharacterExceptionParser();
|
||||
try {
|
||||
if (xmlParser.parseXMLResponse(is)) {
|
||||
mCode = ResultCode.INVALID_CHARACTER_DETECT_IN_SERVER;
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
Log_OC.w(TAG, "Error reading exception from server: " + e.getMessage());
|
||||
// mCode stays as set in this(success, httpCode, headers)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Public constructor from separate elements of an HTTP or DAV response.
|
||||
*
|
||||
* To be used when the result needs to be interpreted from HTTP response elements that could come from
|
||||
* different requests (WARNING: black magic, try to avoid).
|
||||
*
|
||||
* If all the fields come from the same HTTP/DAV response, {@link #RemoteOperationResult(boolean, HttpMethod)}
|
||||
* should be used instead.
|
||||
*
|
||||
* Determines a {@link ResultCode} depending on the HTTP code and HTTP response headers received.
|
||||
*
|
||||
* @param success The operation was considered successful or not.
|
||||
* @param httpCode HTTP status code returned by an HTTP/DAV method.
|
||||
* @param httpPhrase HTTP status line phrase returned by an HTTP/DAV method
|
||||
* @param httpHeaders HTTP response header returned by an HTTP/DAV method
|
||||
*/
|
||||
public RemoteOperationResult(boolean success, int httpCode, String httpPhrase, Header[] httpHeaders) {
|
||||
this(success, httpCode, httpPhrase);
|
||||
if (httpHeaders != null) {
|
||||
Header current;
|
||||
for (Header httpHeader : httpHeaders) {
|
||||
current = httpHeader;
|
||||
if ("location".equals(current.getName().toLowerCase())) {
|
||||
mRedirectedLocation = current.getValue();
|
||||
continue;
|
||||
}
|
||||
if ("www-authenticate".equals(current.getName().toLowerCase())) {
|
||||
mAuthenticate = current.getValue();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (isIdPRedirection()) {
|
||||
mCode = ResultCode.UNAUTHORIZED; // overrides default ResultCode.UNKNOWN
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Private constructor for results built interpreting a HTTP or DAV response.
|
||||
*
|
||||
* Determines a {@link ResultCode} depending of the type of the exception.
|
||||
*
|
||||
* @param success Operation was successful or not.
|
||||
* @param httpCode HTTP status code returned by the HTTP/DAV method.
|
||||
* @param httpPhrase HTTP status line phrase returned by the HTTP/DAV method
|
||||
*/
|
||||
private RemoteOperationResult(boolean success, int httpCode, String httpPhrase) {
|
||||
mSuccess = success;
|
||||
mHttpCode = httpCode;
|
||||
mHttpPhrase = httpPhrase;
|
||||
|
||||
if (success) {
|
||||
mCode = ResultCode.OK;
|
||||
|
||||
} else if (httpCode > 0) {
|
||||
switch (httpCode) {
|
||||
case HttpStatus.SC_UNAUTHORIZED: // 401
|
||||
mCode = ResultCode.UNAUTHORIZED;
|
||||
break;
|
||||
case HttpStatus.SC_FORBIDDEN: // 403
|
||||
mCode = ResultCode.FORBIDDEN;
|
||||
break;
|
||||
case HttpStatus.SC_NOT_FOUND: // 404
|
||||
mCode = ResultCode.FILE_NOT_FOUND;
|
||||
break;
|
||||
case HttpStatus.SC_CONFLICT: // 409
|
||||
mCode = ResultCode.CONFLICT;
|
||||
break;
|
||||
case HttpStatus.SC_INTERNAL_SERVER_ERROR: // 500
|
||||
mCode = ResultCode.INSTANCE_NOT_CONFIGURED; // assuming too much...
|
||||
break;
|
||||
case HttpStatus.SC_SERVICE_UNAVAILABLE: // 503
|
||||
mCode = ResultCode.MAINTENANCE_MODE;
|
||||
break;
|
||||
case HttpStatus.SC_INSUFFICIENT_STORAGE: // 507
|
||||
mCode = ResultCode.QUOTA_EXCEEDED; // surprise!
|
||||
break;
|
||||
default:
|
||||
mCode = ResultCode.UNHANDLED_HTTP_CODE; // UNKNOWN ERROR
|
||||
Log_OC.d(TAG,
|
||||
"RemoteOperationResult has processed UNHANDLED_HTTP_CODE: " +
|
||||
mHttpCode + " " + mHttpPhrase
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void setData(ArrayList<Object> files) {
|
||||
mData = files;
|
||||
@@ -297,6 +351,10 @@ public class RemoteOperationResult implements Serializable {
|
||||
return mHttpCode;
|
||||
}
|
||||
|
||||
public String getHttpPhrase() {
|
||||
return mHttpPhrase;
|
||||
}
|
||||
|
||||
public ResultCode getCode() {
|
||||
return mCode;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user