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>tags/v13.0.0beta2
@@ -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); | |||
}); |