summaryrefslogtreecommitdiffstats
path: root/core/js
diff options
context:
space:
mode:
authorJoas Schilling <coding@schilljs.com>2017-03-17 13:53:04 +0100
committerGitHub <noreply@github.com>2017-03-17 13:53:04 +0100
commit0c0ce25b3cbc23b98e60d4a68e2242d91fab9eec (patch)
treedaefa8c83a9a2bc162c89ef2bb90dbfc8748572e /core/js
parenta5c8016c8b7c50f73b7a16b6bd2284ed06f35d8e (diff)
parent6488ed3cff41d5cf14ca260cc26bcd9b518d5c28 (diff)
downloadnextcloud-server-0c0ce25b3cbc23b98e60d4a68e2242d91fab9eec.tar.gz
nextcloud-server-0c0ce25b3cbc23b98e60d4a68e2242d91fab9eec.zip
Merge pull request #3881 from nextcloud/downstream-26842
Backbone Webdav Adapter MKCOL support
Diffstat (limited to 'core/js')
-rw-r--r--core/js/oc-backbone-webdav.js46
1 files changed, 41 insertions, 5 deletions
diff --git a/core/js/oc-backbone-webdav.js b/core/js/oc-backbone-webdav.js
index 1c1b5c71d81..4e3f11ce091 100644
--- a/core/js/oc-backbone-webdav.js
+++ b/core/js/oc-backbone-webdav.js
@@ -120,7 +120,15 @@
}
var parts = url.split('/');
- return parts[parts.length - 1];
+ var result;
+ do {
+ result = parts[parts.length - 1];
+ parts.pop();
+ // note: first result can be empty when there is a trailing slash,
+ // so we take the part before that
+ } while (!result && parts.length > 0);
+
+ return result;
}
function isSuccessStatus(status) {
@@ -190,6 +198,25 @@
}
+ function callMkCol(client, options, model, headers) {
+ // call MKCOL without data, followed by PROPPATCH
+ return client.request(
+ options.type,
+ options.url,
+ headers,
+ null
+ ).then(function(result) {
+ if (!isSuccessStatus(result.status)) {
+ if (_.isFunction(options.error)) {
+ options.error(result);
+ }
+ return;
+ }
+
+ callPropPatch(client, options, model, headers);
+ });
+ }
+
function callMethod(client, options, model, headers) {
headers['Content-Type'] = 'application/json';
return client.request(
@@ -206,7 +233,7 @@
}
if (_.isFunction(options.success)) {
- if (options.type === 'PUT' || options.type === 'POST') {
+ if (options.type === 'PUT' || options.type === 'POST' || options.type === 'MKCOL') {
// pass the object's own values because the server
// does not return anything
var responseJson = result.body || model.toJSON();
@@ -247,6 +274,8 @@
return callPropFind(client, options, model, headers);
} else if (options.type === 'PROPPATCH') {
return callPropPatch(client, options, model, headers);
+ } else if (options.type === 'MKCOL') {
+ return callMkCol(client, options, model, headers);
} else {
return callMethod(client, options, model, headers);
}
@@ -259,9 +288,16 @@
var params = {type: methodMap[method] || method};
var isCollection = (model instanceof Backbone.Collection);
- if (method === 'update' && (model.usePUT || (model.collection && model.collection.usePUT))) {
- // use PUT instead of PROPPATCH
- params.type = 'PUT';
+ if (method === 'update') {
+ // if a model has an inner collection, it must define an
+ // attribute "hasInnerCollection" that evaluates to true
+ if (model.hasInnerCollection) {
+ // if the model itself is a Webdav collection, use MKCOL
+ params.type = 'MKCOL';
+ } else if (model.usePUT || (model.collection && model.collection.usePUT)) {
+ // use PUT instead of PROPPATCH
+ params.type = 'PUT';
+ }
}
// Ensure that we have a URL.