1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
5 import { customEncodeURI } from "./url";
9 private defaults: WebDAVDefaults = {
12 'Cache-Control': 'must-revalidate'
16 constructor(config?: Partial<WebDAVDefaults>, private createRequest = () => new XMLHttpRequest()) {
22 ...this.defaults.headers,
29 getBaseUrl = (): string => this.defaults.baseURL;
30 setAuthorization = (token?) => this.defaults.headers.Authorization = token;
32 propfind = (url: string, config: WebDAVRequestConfig = {}) =>
38 put = (url: string, data?: any, config: WebDAVRequestConfig = {}) =>
45 get = (url: string, config: WebDAVRequestConfig = {}) =>
51 upload = (url: string, files: File[], config: WebDAVRequestConfig = {}) => {
53 files.map(file => this.request({
61 copy = (url: string, destination: string, config: WebDAVRequestConfig = {}) =>
67 Destination: this.defaults.baseURL
68 ? this.defaults.baseURL.replace(/\/+$/, '') + '/' + destination.replace(/^\/+/, '')
73 move = (url: string, destination: string, config: WebDAVRequestConfig = {}) =>
79 Destination: this.defaults.baseURL
80 ? this.defaults.baseURL.replace(/\/+$/, '') + '/' + destination.replace(/^\/+/, '')
85 delete = (url: string, config: WebDAVRequestConfig = {}) =>
91 mkdir = (url: string, config: WebDAVRequestConfig = {}) =>
100 private request = (config: RequestConfig) => {
101 return new Promise<XMLHttpRequest>((resolve, reject) => {
102 const r = this.createRequest();
103 this.defaults.baseURL = this.defaults.baseURL.replace(/\/+$/, '');
104 r.open(config.method,
105 `${this.defaults.baseURL
106 ? this.defaults.baseURL+'/'
107 : ''}${customEncodeURI(config.url)}`);
109 const headers = { ...this.defaults.headers, ...config.headers };
112 .forEach(key => r.setRequestHeader(key, headers[key]));
114 if (!(window as any).cancelTokens) {
115 Object.assign(window, { cancelTokens: {} });
118 (window as any).cancelTokens[config.url] = () => {
123 if (config.onUploadProgress) {
124 r.upload.addEventListener('progress', config.onUploadProgress);
127 // This event gets triggered on *any* server response
128 r.addEventListener('load', () => {
129 if (r.status >= 400) {
136 // This event gets triggered on network errors
137 r.addEventListener('error', () => {
141 r.upload.addEventListener('error', () => {
150 export interface WebDAVRequestConfig {
152 [key: string]: string;
154 onUploadProgress?: (event: ProgressEvent) => void;
157 interface WebDAVDefaults {
159 headers: { [key: string]: string };
162 interface RequestConfig {
165 headers?: { [key: string]: string };
167 onUploadProgress?: (event: ProgressEvent) => void;