15685: Merge branch 'master' into 15685-file-renaming-empty-name
[arvados-workbench2.git] / src / common / webdav.ts
index 3f55a841bd6752807cd07cc85ec4be385156aa44..b51cff30703ea51b392b87a2998f9607f052c5a3 100644 (file)
@@ -42,14 +42,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 +71,11 @@ export class WebDAV {
     private request = (config: RequestConfig) => {
         return new Promise<XMLHttpRequest>((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+'/'
+                    : ''}${config.url}`);
             const headers = { ...this.defaults.headers, ...config.headers };
             Object
                 .keys(headers)
@@ -71,14 +85,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);
             });