Update davclient.js to 0.1.1

Signed-off-by: Morris Jobke <hey@morrisjobke.de>
This commit is contained in:
Vincent Petry 2017-03-10 08:06:03 +01:00 committed by Morris Jobke
parent d551b8e6fd
commit b1c98404d0
No known key found for this signature in database
GPG Key ID: 9CE5ED29E7FCD38A
3 changed files with 87 additions and 29 deletions

View File

@ -29,7 +29,7 @@
"underscore": "~1.8.0", "underscore": "~1.8.0",
"bootstrap": "~3.3.6", "bootstrap": "~3.3.6",
"backbone": "~1.2.3", "backbone": "~1.2.3",
"davclient.js": "https://github.com/evert/davclient.js.git", "davclient.js": "https://github.com/evert/davclient.js.git#0.1.1",
"es6-promise": "https://github.com/jakearchibald/es6-promise.git#~2.3.0", "es6-promise": "https://github.com/jakearchibald/es6-promise.git#~2.3.0",
"base64": "~0.3.0", "base64": "~0.3.0",
"clipboard": "^1.5.12", "clipboard": "^1.5.12",

View File

@ -1,6 +1,6 @@
{ {
"name": "davclient.js", "name": "davclient.js",
"version": "0.0.1", "version": "0.1.1",
"authors": [ "authors": [
"Evert Pot <me@evertpot.com>" "Evert Pot <me@evertpot.com>"
], ],
@ -20,13 +20,14 @@
"test", "test",
"tests" "tests"
], ],
"_release": "0.0.1", "_release": "0.1.1",
"_resolution": { "_resolution": {
"type": "version", "type": "version",
"tag": "0.0.1", "tag": "0.1.1",
"commit": "2d054c63ba5bf7f7d40de904a742f3ad9c71e63c" "commit": "a2731f81540816b212c09d14596621cb070a4f10"
}, },
"_source": "https://github.com/evert/davclient.js.git", "_source": "https://github.com/evert/davclient.js.git",
"_target": "*", "_target": "0.1.1",
"_originalSource": "https://github.com/evert/davclient.js.git" "_originalSource": "https://github.com/evert/davclient.js.git",
"_direct": true
} }

View File

@ -1,3 +1,8 @@
/*
* vim: expandtab shiftwidth=4 softtabstop=4
*/
/* global dav */
if (typeof dav == 'undefined') { dav = {}; }; if (typeof dav == 'undefined') { dav = {}; };
dav._XML_CHAR_MAP = { dav._XML_CHAR_MAP = {
@ -99,11 +104,43 @@ dav.Client.prototype = {
}, },
/**
* Renders a "d:set" block for the given properties.
*
* @param {Object.<String,String>} properties
* @return {String} XML "<d:set>" block
*/
_renderPropSet: function(properties) {
var body = ' <d:set>\n' +
' <d:prop>\n';
for(var ii in properties) {
var property = this.parseClarkNotation(ii);
var propName;
var propValue = properties[ii];
if (this.xmlNamespaces[property.namespace]) {
propName = this.xmlNamespaces[property.namespace] + ':' + property.name;
} else {
propName = 'x:' + property.name + ' xmlns:x="' + property.namespace + '"';
}
// FIXME: hard-coded for now until we allow properties to
// specify whether to be escaped or not
if (propName !== 'd:resourcetype') {
propValue = dav._escapeXml(propValue);
}
body += ' <' + propName + '>' + propValue + '</' + propName + '>\n';
}
body +=' </d:prop>\n';
body +=' </d:set>\n';
return body;
},
/** /**
* Generates a propPatch request. * Generates a propPatch request.
* *
* @param {string} url Url to do the proppatch request on * @param {string} url Url to do the proppatch request on
* @param {Array} properties List of properties to store. * @param {Object.<String,String>} properties List of properties to store.
* @param {Object} [headers] headers * @param {Object} [headers] headers
* @return {Promise} * @return {Promise}
*/ */
@ -119,25 +156,8 @@ dav.Client.prototype = {
for (namespace in this.xmlNamespaces) { for (namespace in this.xmlNamespaces) {
body += ' xmlns:' + this.xmlNamespaces[namespace] + '="' + namespace + '"'; body += ' xmlns:' + this.xmlNamespaces[namespace] + '="' + namespace + '"';
} }
body += '>\n' + body += '>\n' + this._renderPropSet(properties);
' <d:set>\n' + body += '</d:propertyupdate>';
' <d:prop>\n';
for(var ii in properties) {
var property = this.parseClarkNotation(ii);
var propName;
var propValue = properties[ii];
if (this.xmlNamespaces[property.namespace]) {
propName = this.xmlNamespaces[property.namespace] + ':' + property.name;
} else {
propName = 'x:' + property.name + ' xmlns:x="' + property.namespace + '"';
}
body += ' <' + propName + '>' + dav._escapeXml(propValue) + '</' + propName + '>\n';
}
body+=' </d:prop>\n';
body+=' </d:set>\n';
body+='</d:propertyupdate>';
return this.request('PROPPATCH', url, headers, body).then( return this.request('PROPPATCH', url, headers, body).then(
function(result) { function(result) {
@ -151,6 +171,44 @@ dav.Client.prototype = {
}, },
/**
* Generates a MKCOL request.
* If attributes are given, it will use an extended MKCOL request.
*
* @param {string} url Url to do the proppatch request on
* @param {Object.<String,String>} [properties] list of properties to store.
* @param {Object} [headers] headers
* @return {Promise}
*/
mkcol : function(url, properties, headers) {
var body = '';
headers = headers || {};
headers['Content-Type'] = 'application/xml; charset=utf-8';
if (properties) {
body =
'<?xml version="1.0"?>\n' +
'<d:mkcol';
var namespace;
for (namespace in this.xmlNamespaces) {
body += ' xmlns:' + this.xmlNamespaces[namespace] + '="' + namespace + '"';
}
body += '>\n' + this._renderPropSet(properties);
body +='</d:mkcol>';
}
return this.request('MKCOL', url, headers, body).then(
function(result) {
return {
status: result.status,
body: result.body,
xhr: result.xhr
};
}.bind(this)
);
},
/** /**
* Performs a HTTP request, and returns a Promise * Performs a HTTP request, and returns a Promise
* *
@ -293,10 +351,9 @@ dav.Client.prototype = {
var propStatNode = propStatIterator.iterateNext(); var propStatNode = propStatIterator.iterateNext();
while(propStatNode) { while(propStatNode) {
var propStat = { var propStat = {
status : doc.evaluate('string(d:status)', propStatNode, resolver, XPathResult.ANY_TYPE, null).stringValue, status : doc.evaluate('string(d:status)', propStatNode, resolver, XPathResult.ANY_TYPE, null).stringValue,
properties : [], properties : {},
}; };
var propIterator = doc.evaluate('d:prop/*', propStatNode, resolver, XPathResult.ANY_TYPE, null); var propIterator = doc.evaluate('d:prop/*', propStatNode, resolver, XPathResult.ANY_TYPE, null);