Parse Sabre Exception in OC.Files.Client and file-upload
In case of error, instead of a generic error message, an upload will display whichever message is returned in the Sabre Exception, if applicable. Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
This commit is contained in:
parent
1a2f9fe678
commit
dfc91a253c
3 changed files with 82 additions and 18 deletions
|
@ -303,7 +303,23 @@ OC.FileUpload.prototype = {
|
|||
*/
|
||||
getResponse: function() {
|
||||
var response = this.data.response();
|
||||
if (typeof response.result !== 'string') {
|
||||
if (response.errorThrown) {
|
||||
// attempt parsing Sabre exception is available
|
||||
var xml = response.jqXHR.responseXML;
|
||||
if (xml.documentElement.localName === 'error' && xml.documentElement.namespaceURI === 'DAV:') {
|
||||
var messages = xml.getElementsByTagNameNS('http://sabredav.org/ns', 'message');
|
||||
var exceptions = xml.getElementsByTagNameNS('http://sabredav.org/ns', 'exception');
|
||||
if (messages.length) {
|
||||
response.message = messages[0].textContent;
|
||||
}
|
||||
if (exceptions.length) {
|
||||
response.exception = exceptions[0].textContent;
|
||||
}
|
||||
return response;
|
||||
}
|
||||
}
|
||||
|
||||
if (typeof response.result !== 'string' && response.result) {
|
||||
//fetch response from iframe
|
||||
response = $.parseJSON(response.result[0].body.innerText);
|
||||
if (!response) {
|
||||
|
@ -931,6 +947,7 @@ OC.Uploader.prototype = _.extend({
|
|||
status = upload.getResponseStatus();
|
||||
}
|
||||
self.log('fail', e, upload);
|
||||
self._hideProgressBar();
|
||||
|
||||
if (data.textStatus === 'abort') {
|
||||
self.showUploadCancelMessage();
|
||||
|
@ -947,7 +964,12 @@ OC.Uploader.prototype = _.extend({
|
|||
self.cancelUploads();
|
||||
} else {
|
||||
// HTTP connection problem or other error
|
||||
OC.Notification.show(data.errorThrown, {type: 'error'});
|
||||
var message = '';
|
||||
if (upload) {
|
||||
var response = upload.getResponse();
|
||||
message = response.message;
|
||||
}
|
||||
OC.Notification.show(message || data.errorThrown, {type: 'error'});
|
||||
}
|
||||
|
||||
if (upload) {
|
||||
|
@ -1144,16 +1166,17 @@ OC.Uploader.prototype = _.extend({
|
|||
upload.done().then(function() {
|
||||
self._hideProgressBar();
|
||||
self.trigger('done', e, upload);
|
||||
}).fail(function(status) {
|
||||
}).fail(function(status, response) {
|
||||
var message = response.message;
|
||||
self._hideProgressBar();
|
||||
if (status === 507) {
|
||||
// not enough space
|
||||
OC.Notification.show(t('files', 'Not enough free space'), {type: 'error'});
|
||||
OC.Notification.show(message || t('files', 'Not enough free space'), {type: 'error'});
|
||||
self.cancelUploads();
|
||||
} else if (status === 409) {
|
||||
OC.Notification.show(t('files', 'Target folder does not exist any more'), {type: 'error'});
|
||||
OC.Notification.show(message || t('files', 'Target folder does not exist any more'), {type: 'error'});
|
||||
} else {
|
||||
OC.Notification.show(t('files', 'Error when assembling chunks, status code {status}', {status: status}), {type: 'error'});
|
||||
OC.Notification.show(message || t('files', 'Error when assembling chunks, status code {status}', {status: status}), {type: 'error'});
|
||||
}
|
||||
self.trigger('fail', e, data);
|
||||
});
|
||||
|
|
|
@ -394,6 +394,26 @@
|
|||
return status >= 200 && status <= 299;
|
||||
},
|
||||
|
||||
/**
|
||||
* Parse the Sabre exception out of the given response, if any
|
||||
*
|
||||
* @param {Object} response object
|
||||
* @return {Object} array of parsed message and exception (only the first one)
|
||||
*/
|
||||
_getSabreException: function(response) {
|
||||
var result = {};
|
||||
var xml = response.xhr.responseXML;
|
||||
var messages = xml.getElementsByTagNameNS('http://sabredav.org/ns', 'message');
|
||||
var exceptions = xml.getElementsByTagNameNS('http://sabredav.org/ns', 'exception');
|
||||
if (messages.length) {
|
||||
result.message = messages[0].textContent;
|
||||
}
|
||||
if (exceptions.length) {
|
||||
result.exception = exceptions[0].textContent;
|
||||
}
|
||||
return result;
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns the default PROPFIND properties to use during a call.
|
||||
*
|
||||
|
@ -447,7 +467,8 @@
|
|||
}
|
||||
deferred.resolve(result.status, results);
|
||||
} else {
|
||||
deferred.reject(result.status);
|
||||
result = _.extend(result, self._getSabreException(result));
|
||||
deferred.reject(result.status, result);
|
||||
}
|
||||
});
|
||||
return promise;
|
||||
|
@ -521,7 +542,8 @@
|
|||
var results = self._parseResult(result.body);
|
||||
deferred.resolve(result.status, results);
|
||||
} else {
|
||||
deferred.reject(result.status);
|
||||
result = _.extend(result, self._getSabreException(result));
|
||||
deferred.reject(result.status, result);
|
||||
}
|
||||
});
|
||||
return promise;
|
||||
|
@ -560,7 +582,8 @@
|
|||
if (self._isSuccessStatus(result.status)) {
|
||||
deferred.resolve(result.status, self._parseResult([result.body])[0]);
|
||||
} else {
|
||||
deferred.reject(result.status);
|
||||
result = _.extend(result, self._getSabreException(result));
|
||||
deferred.reject(result.status, result);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
@ -590,7 +613,8 @@
|
|||
if (self._isSuccessStatus(result.status)) {
|
||||
deferred.resolve(result.status, result.body);
|
||||
} else {
|
||||
deferred.reject(result.status);
|
||||
result = _.extend(result, self._getSabreException(result));
|
||||
deferred.reject(result.status, result);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
@ -639,7 +663,8 @@
|
|||
if (self._isSuccessStatus(result.status)) {
|
||||
deferred.resolve(result.status);
|
||||
} else {
|
||||
deferred.reject(result.status);
|
||||
result = _.extend(result, self._getSabreException(result));
|
||||
deferred.reject(result.status, result);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
@ -663,7 +688,8 @@
|
|||
if (self._isSuccessStatus(result.status)) {
|
||||
deferred.resolve(result.status);
|
||||
} else {
|
||||
deferred.reject(result.status);
|
||||
result = _.extend(result, self._getSabreException(result));
|
||||
deferred.reject(result.status, result);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
@ -727,11 +753,12 @@
|
|||
this._buildUrl(path),
|
||||
headers
|
||||
).then(
|
||||
function(response) {
|
||||
if (self._isSuccessStatus(response.status)) {
|
||||
deferred.resolve(response.status);
|
||||
function(result) {
|
||||
if (self._isSuccessStatus(result.status)) {
|
||||
deferred.resolve(result.status);
|
||||
} else {
|
||||
deferred.reject(response.status);
|
||||
result = _.extend(result, self._getSabreException(result));
|
||||
deferred.reject(result.status, result);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
|
|
@ -87,14 +87,28 @@ describe('OC.Files.Client tests', function() {
|
|||
promise.done(successHandler);
|
||||
promise.fail(failHandler);
|
||||
|
||||
var errorXml =
|
||||
'<d:error xmlns:d="DAV:" xmlns:s="http://sabredav.org/ns">' +
|
||||
' <s:exception>Sabre\\DAV\\Exception\\SomeException</s:exception>' +
|
||||
' <s:message>Some error message</s:message>' +
|
||||
'</d:error>';
|
||||
|
||||
var parser = new DOMParser();
|
||||
|
||||
requestDeferred.resolve({
|
||||
status: status,
|
||||
body: ''
|
||||
body: errorXml,
|
||||
xhr: {
|
||||
responseXML: parser.parseFromString(errorXml, 'application/xml')
|
||||
}
|
||||
});
|
||||
|
||||
promise.then(function() {
|
||||
expect(failHandler.calledOnce).toEqual(true);
|
||||
expect(failHandler.calledWith(status)).toEqual(true);
|
||||
expect(failHandler.getCall(0).args[0]).toEqual(status);
|
||||
expect(failHandler.getCall(0).args[1].status).toEqual(status);
|
||||
expect(failHandler.getCall(0).args[1].message).toEqual('Some error message');
|
||||
expect(failHandler.getCall(0).args[1].exception).toEqual('Sabre\\DAV\\Exception\\SomeException');
|
||||
|
||||
expect(successHandler.notCalled).toEqual(true);
|
||||
});
|
||||
|
|
Loading…
Reference in a new issue