UNPKG

@documentica/webdav

Version:
156 lines (155 loc) 7.19 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const Multistatus_1 = __importDefault(require("./Multistatus")); function createWebdavRequest(req) { if (req.progressListener && req.config.host == "/") return createWebdavRequestXHR(req); else return createWebdavRequestFetch(req); } exports.createWebdavRequest = createWebdavRequest; function createWebdavRequestFetch({ config: { defaultHeaders, host, withCredentials, defaultFail, authenticationMethod, username, password, realm, }, method, path, headers, success, fail, body, resourceName, responseType, multistatus, progressListener }) { if (path.substring(0, 1) !== '/') { path = '/' + path; } const url = host ? host + path : path; const fileName = url.split("/").filter(i => i).pop(); const authHeader = (authenticationMethod == "basic" ? { "Authorization": "Basic " + btoa(username + ":" + password) } : {}); fetch(url, { method, headers: Object.assign(Object.assign(Object.assign({}, defaultHeaders), headers), authHeader), credentials: 'include', cache: "no-cache", body }) .then(response => { if (response.status < 200 || response.status >= 300) { if (fail) fail(response.status, body, response.statusText, resourceName || fileName); else if (defaultFail) defaultFail(response.status, body, response.statusText, resourceName || fileName); else throw "No fail handler found " + response.status; } else { new Promise((resolve, reject) => { switch (responseType) { case 'blob': resolve(response.blob()); break; case 'json': resolve(response.json()); break; case 'xml': default: return resolve(response.text()); } }) .catch(e => console.log(e, url)) .then(resp => { window.resp = response; if (responseType == "xml") { let xml = new window.DOMParser().parseFromString(resp, "text/xml"); if (multistatus) { let body = undefined; for (var counter = 0; counter < xml.childNodes.length; counter++) { if (xml.childNodes.item(counter).localName === 'multistatus') { body = new Multistatus_1.default(xml.childNodes.item(counter)); break; } } success(response.status, body, response.statusText, resourceName || fileName, response.headers); } else success(response.status, xml, response.statusText, resourceName || fileName, response.headers); } else { success(response.status, resp, response.statusText, resourceName || fileName, response.headers); } }); } }).catch(e => { if (fail) fail(0, "unable to connect", "unable to connect"); else if (defaultFail) defaultFail(0, "unable to connect " + path + " with method " + method, "unable to connect"); else throw "No fail handler found " + path + " " + method; }); } exports.createWebdavRequestFetch = createWebdavRequestFetch; ; function createWebdavRequestXHR({ config: { defaultHeaders, host, withCredentials, defaultFail, authenticationMethod, username, password, realm, }, method, path, headers, success, fail, body, resourceName, responseType, multistatus, progressListener }) { if (path.substring(0, 1) !== '/') { path = '/' + path; } const url = host ? host + path : path; const fileName = url.split("/").filter(i => i).pop(); var ajax = new XMLHttpRequest(); ajax.open(method, url, true); ajax.withCredentials = true; if (multistatus) responseType = "xml"; switch (responseType) { case "blob": ajax.responseType = "blob"; break; case "json": ajax.overrideMimeType("application/json"); break; } if (progressListener) ajax.upload.addEventListener("progress", progressListener); ajax.onreadystatechange = function () { if (ajax.readyState === 4) { //if request has completed if (ajax.status < 200 || ajax.status >= 300) { if (fail) fail(ajax.status, body, ajax.statusText, resourceName || fileName); else if (defaultFail) defaultFail(ajax.status, body, ajax.statusText, resourceName || fileName); else throw "No fail handler found " + ajax.status; } else { switch (responseType) { case 'blob': success(ajax.status, ajax.response, ajax.statusText, resourceName || fileName); break; case 'json': success(ajax.status, JSON.parse(ajax.responseText), ajax.statusText, resourceName || fileName); break; case 'xml': if (multistatus) { let body = undefined; for (var counter = 0; counter < ajax.responseXML.childNodes.length; counter++) { if (ajax.responseXML.childNodes.item(counter).localName === 'multistatus') { body = new Multistatus_1.default(ajax.responseXML.childNodes.item(counter)); break; } } success(ajax.status, body, ajax.statusText, resourceName || fileName); } else success(ajax.status, ajax.responseXML, ajax.statusText, resourceName || fileName); break; default: success(ajax.status, ajax.responseText, ajax.statusText, resourceName || fileName); } } } }; if (defaultHeaders) Object.keys(defaultHeaders).forEach(header => ajax.setRequestHeader(header, defaultHeaders[header])); if (headers) Object.keys(headers).forEach(header => ajax.setRequestHeader(header, headers[header])); if (authenticationMethod == "basic") ajax.setRequestHeader("Authorization", "Basic " + btoa(username + ":" + password)); ajax.withCredentials = withCredentials || false; ajax.send(body); return ajax; } exports.createWebdavRequestXHR = createWebdavRequestXHR; ;