From b183db493a8b989fdb5dfeec706b8b7253b925b7 Mon Sep 17 00:00:00 2001 From: Omar BENHAMID Date: Tue, 14 Feb 2017 12:17:52 +0000 Subject: [PATCH 1/3] Fixing XML parsing using namespaces + fixes of interpretation of PROPFIND response href --- src/webdav.js | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/webdav.js b/src/webdav.js index 2774d4c..c403149 100644 --- a/src/webdav.js +++ b/src/webdav.js @@ -58,13 +58,13 @@ var WebDAV = { // An Object-oriented API around WebDAV. WebDAV.Fs = function(rootUrl) { - this.rootUrl = rootUrl; + this.rootUrl = rootUrl.replace(/\/$/, ''); // Strip trailing slash; var fs = this; - this.file = function(href) { + this.file = function(href, urlisabsolute) { this.type = 'file'; - this.url = fs.urlFor(href); + this.url = urlisabsolute ? href : fs.urlFor(href);; this.name = fs.nameFor(this.url); @@ -83,10 +83,10 @@ WebDAV.Fs = function(rootUrl) { return this; }; - this.dir = function(href) { + this.dir = function(href,urlisabsolute) { this.type = 'dir'; - this.url = fs.urlFor(href); + this.url = urlisabsolute ? href : fs.urlFor(href); this.name = fs.nameFor(this.url); @@ -97,19 +97,19 @@ WebDAV.Fs = function(rootUrl) { } var result = []; // Start at 1, because the 0th is the same as self. - for(var i=1; i< doc.childNodes.length; i++) { - var response = doc.childNodes[i]; - var href = response.getElementsByTagName('D:href')[0].firstChild.nodeValue; + for(var i=1; i< doc.children.length; i++) { + var response = doc.children[i]; + var href = response.getElementsByTagNameNS('DAV:','href')[0].firstChild.nodeValue; href = href.replace(/\/$/, ''); // Strip trailing slash - var propstat = response.getElementsByTagName('D:propstat')[0]; - var prop = propstat.getElementsByTagName('D:prop')[0]; - var resourcetype = prop.getElementsByTagName('D:resourcetype')[0]; - var collection = resourcetype.getElementsByTagName('D:collection')[0]; + var propstat = response.getElementsByTagNameNS('DAV:','propstat')[0]; + var prop = propstat.getElementsByTagNameNS('DAV:','prop')[0]; + var resourcetype = prop.getElementsByTagNameNS('DAV:','resourcetype')[0]; + var collection = resourcetype.getElementsByTagNameNS('DAV:','collection')[0]; if(collection) { - result[i-1] = new fs.dir(href); + result[i-1] = new fs.dir(href,true); } else { - result[i-1] = new fs.file(href); + result[i-1] = new fs.file(href,true); } } return result; From 6f47e395d0edbd109336a3af8d0f3b7071a9f30a Mon Sep 17 00:00:00 2001 From: Omar BENHAMID Date: Tue, 14 Feb 2017 12:19:05 +0000 Subject: [PATCH 2/3] SUPPORT for COPY and MOVE --- src/webdav.js | 45 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 37 insertions(+), 8 deletions(-) diff --git a/src/webdav.js b/src/webdav.js index c403149..ffbcd9a 100644 --- a/src/webdav.js +++ b/src/webdav.js @@ -20,6 +20,15 @@ var WebDAV = { return this.request('PUT', url, {}, data, 'text', callback); }, + COPY: function(url, desturl, callback) { + return this.request('COPY',url, {"Destination":desturl, "Depth":'infinity'}, null, 'text', callback); + }, + + MOVE: function(url, desturl, callback) { + return this.request('MOVE',url, {"Destination":desturl, "Depth":'infinity'}, null, 'text', callback); + }, + + request: function(verb, url, headers, data, type, callback) { var xhr = new XMLHttpRequest(); var body = function() { @@ -44,7 +53,7 @@ var WebDAV = { }; } xhr.open(verb, url, !!callback); - xhr.setRequestHeader("Content-Type", "text/xml; charset=UTF-8"); + if(data != null) xhr.setRequestHeader("Content-Type", "text/xml; charset=UTF-8"); for (var header in headers) { xhr.setRequestHeader(header, headers[header]); } @@ -58,9 +67,33 @@ var WebDAV = { // An Object-oriented API around WebDAV. WebDAV.Fs = function(rootUrl) { + //Make url absolute + if(!/^http/.test(rootUrl)) rootUrl = location.protocol + '//' + location.host + rootUrl; + this.rootUrl = rootUrl.replace(/\/$/, ''); // Strip trailing slash; + var fs = this; + function addcommon(obj) { + obj.copy = function(desturl, callback) { + return WebDAV.COPY(this.url, fs.urlFor(desturl), function() { + console.log("FIXME: Pass in undefined in case of error !!"); + callback(fs[obj.type](desturl)); + }); + } + + obj.move = function(desturl, callback) { + return WebDAV.MOVE(this.url, fs.urlFor(desturl), function() { + console.log("FIXME: Pass in undefined in case of error !!"); + callback(fs[obj.type](desturl)); + }); + } + + this.rm = function(callback) { + return WebDAV.DELETE(this.url, callback); + } + } + this.file = function(href, urlisabsolute) { this.type = 'file'; @@ -76,10 +109,8 @@ WebDAV.Fs = function(rootUrl) { return WebDAV.PUT(this.url, data, callback); }; - this.rm = function(callback) { - return WebDAV.DELETE(this.url, callback); - }; - + addcommon(this); + return this; }; @@ -124,9 +155,7 @@ WebDAV.Fs = function(rootUrl) { } }; - this.rm = function(callback) { - return WebDAV.DELETE(this.url, callback); - }; + addcommon(this); this.mkdir = function(callback) { return WebDAV.MKCOL(this.url, callback); From 87131f29b765b8d8f4e3df6e34a50ce4d57b6877 Mon Sep 17 00:00:00 2001 From: Omar BENHAMID Date: Tue, 14 Feb 2017 12:19:51 +0000 Subject: [PATCH 3/3] Fixes + Added error reporting when server response is not Ok --- src/webdav.js | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/webdav.js b/src/webdav.js index ffbcd9a..c2cec2b 100644 --- a/src/webdav.js +++ b/src/webdav.js @@ -1,4 +1,5 @@ // A raw WebDAV interface +// callbacks are all : function(body,error,xhrobj). var WebDAV = { GET: function(url, callback) { return this.request('GET', url, {}, null, 'text', callback); @@ -45,10 +46,7 @@ var WebDAV = { if(callback) { xhr.onreadystatechange = function() { if(xhr.readyState == 4) { // complete. - var b = body(); - if(b) { - callback(b); - } + callback((body() || ""), xhr.status >= 400, xhr); } }; } @@ -75,17 +73,16 @@ WebDAV.Fs = function(rootUrl) { var fs = this; function addcommon(obj) { + //Copy: callback will receive the new file/dir object or undefined if error occurs with xhr object to fetch details obj.copy = function(desturl, callback) { - return WebDAV.COPY(this.url, fs.urlFor(desturl), function() { - console.log("FIXME: Pass in undefined in case of error !!"); - callback(fs[obj.type](desturl)); + return WebDAV.COPY(this.url, fs.urlFor(desturl), function(body,error,xhr) { + callback(error ? undefined : fs[obj.type](desturl),xhr); }); } obj.move = function(desturl, callback) { - return WebDAV.MOVE(this.url, fs.urlFor(desturl), function() { - console.log("FIXME: Pass in undefined in case of error !!"); - callback(fs[obj.type](desturl)); + return WebDAV.MOVE(this.url, fs.urlFor(desturl), function(body,error,xhr) { + callback(error ? undefined : fs[obj.type](desturl),xhr); }); }