diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/caldav/request/asset.js | 141 | ||||
-rw-r--r-- | lib/caldav/request/index.js | 3 | ||||
-rw-r--r-- | lib/caldav/sax/dav_response.js | 2 |
3 files changed, 144 insertions, 2 deletions
diff --git a/lib/caldav/request/asset.js b/lib/caldav/request/asset.js new file mode 100644 index 0000000..b26e4f7 --- /dev/null +++ b/lib/caldav/request/asset.js @@ -0,0 +1,141 @@ +(function(module, ns) { + + var XHR = ns.require('xhr'); + + /** + * Creates an Http request for a single webdav resource. + * Thin wrapper over http/xhr each public method has the same + * signature with similar options: + * + * // the intent is that after a larger calendar query + * // the urls are stored and can be used to modify the + * // calendar resources. + * var asset = new Caldav.Request.Asset(con, 'someurl'); + * + * asset.get({ etag: 'foo'}, function(err, data) { + * }); + * + * asset.put({ etag: 'foo' }, body, function(err, data) { + * + * }); + * + * asset.delete(function() { + * + * }); + * + * @param {Caldav.Connection} connection connection details. + * @param {String} url assert url. + */ + function Asset(connection, url) { + if (!connection) { + throw new Error('must pass connection object'); + } + this.connection = connection; + this.url = url; + } + + Asset.prototype = { + + contentType: 'text/calendar', + + _buildRequest: function(method, options) { + var headers = { + 'Content-Type': this.contentType + }; + + if (options && options.contentType) { + headers['Content-Type'] = options.contentType; + } + + if (options && options.etag) { + headers['If-None-Match'] = options.etag; + } + + return this.connection.request({ + url: this.url, + headers: headers, + method: method + }); + }, + + /** + * Find a single calendar asset. + * This method should only be used to either + * confirm a put or delete request. + * + * Calendar query is far more suited for fetching + * large amounts of calendar data. + * + * Options: + * - etag: used to issue a 'If-Not-Match' + * + * @param {Object} [options] calendar options. + * @param {Function} callback node style [err, data, xhr]. + */ + get: function(options, callback) { + if (typeof(options) === 'function') { + callback = options; + options = null; + } + + var req = this._buildRequest('GET', options); + + req.send(function(err, xhr) { + callback(err, xhr.responseText, xhr); + }); + }, + + /** + * Adds or modifies a single calendar resource. + * + * @param {Object} [options] see get. + * @param {String} data post content. + * @param {Function} callback node style [err, data, xhr]. + */ + put: function(options, data, callback) { + if (typeof(options) === 'string') { + data = options; + options = null; + } + + if (typeof(data) === 'function') { + callback = data; + data = null; + } + + var req = this._buildRequest('PUT', options); + req.data = data; + + req.send(function(err, xhr) { + callback(err, xhr.responseText, xhr); + }); + }, + + /** + * Deletes a calendar resource + * + * @param {Object} [options] see get. + * @param {Function} callback node style [err, data, xhr]. + */ + delete: function(options, callback) { + if (typeof(options) === 'function') { + callback = options; + options = null; + } + + var req = this._buildRequest('DELETE', options); + + req.send(function(err, xhr) { + callback(err, xhr.responseText, xhr); + }); + } + }; + + module.exports = Asset; + +}.apply( + this, + (this.Caldav) ? + [Caldav('request/asset'), Caldav] : + [module, require('../caldav')] +)); diff --git a/lib/caldav/request/index.js b/lib/caldav/request/index.js index 6f8c23d..aad595e 100644 --- a/lib/caldav/request/index.js +++ b/lib/caldav/request/index.js @@ -5,7 +5,8 @@ CalendarQuery: ns.require('request/calendar_query'), Propfind: ns.require('request/propfind'), CalendarHome: ns.require('request/calendar_home'), - Resources: ns.require('request/resources') + Resources: ns.require('request/resources'), + Asset: ns.require('request/asset') }; }.apply( diff --git a/lib/caldav/sax/dav_response.js b/lib/caldav/sax/dav_response.js index e257027..6953161 100644 --- a/lib/caldav/sax/dav_response.js +++ b/lib/caldav/sax/dav_response.js @@ -108,7 +108,7 @@ var tag = data[handler.tagField]; var last = this.tagStack[this.tagStack.length - 1]; - if (last.handler === handler) { + if (last.handler && last.handler === handler) { this.stack.push(this.current); this.current = this.current[tag] = []; } else { |