X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/344157221aba0ca459e3024a79530287c8113a5c..304bc635e4c80f17cf65e4c52cb0d834f30205b8:/src/common/webdav.ts diff --git a/src/common/webdav.ts b/src/common/webdav.ts index a09e8fdd..758a5e18 100644 --- a/src/common/webdav.ts +++ b/src/common/webdav.ts @@ -2,6 +2,8 @@ // // SPDX-License-Identifier: AGPL-3.0 +import { customEncodeURI } from "./url"; + export class WebDAV { defaults: WebDAVDefaults = { @@ -42,14 +44,24 @@ export class WebDAV { this.request({ ...config, url, method: 'COPY', - headers: { ...config.headers, Destination: this.defaults.baseURL + destination } + headers: { + ...config.headers, + Destination: this.defaults.baseURL + ? this.defaults.baseURL.replace(/\/+$/, '') + '/' + destination.replace(/^\/+/, '') + : destination + } }) move = (url: string, destination: string, config: WebDAVRequestConfig = {}) => this.request({ ...config, url, method: 'MOVE', - headers: { ...config.headers, Destination: this.defaults.baseURL + destination } + headers: { + ...config.headers, + Destination: this.defaults.baseURL + ? this.defaults.baseURL.replace(/\/+$/, '') + '/' + destination.replace(/^\/+/, '') + : destination + } }) delete = (url: string, config: WebDAVRequestConfig = {}) => @@ -61,7 +73,12 @@ export class WebDAV { private request = (config: RequestConfig) => { return new Promise((resolve, reject) => { const r = this.createRequest(); - r.open(config.method, this.defaults.baseURL + config.url); + this.defaults.baseURL = this.defaults.baseURL.replace(/\/+$/, ''); + r.open(config.method, + `${this.defaults.baseURL + ? this.defaults.baseURL+'/' + : ''}${customEncodeURI(config.url)}`); + const headers = { ...this.defaults.headers, ...config.headers }; Object .keys(headers) @@ -71,14 +88,16 @@ export class WebDAV { r.upload.addEventListener('progress', config.onUploadProgress); } + // This event gets triggered on *any* server response r.addEventListener('load', () => { - if (r.status === 404) { + if (r.status >= 400) { return reject(r); } else { return resolve(r); } }); + // This event gets triggered on network errors r.addEventListener('error', () => { return reject(r); });