From a1620f28f76371a9b4eb3910d7f080b005744074 Mon Sep 17 00:00:00 2001 From: Pierre Date: Fri, 26 Aug 2022 16:19:52 -0300 Subject: [PATCH] [FIX] Upload fails when using WebDav as file storage --- .../app/file-upload/ufs/Webdav/server.js | 4 ++-- .../webdav/server/lib/webdavClientAdapter.ts | 20 +++++++++++++++++-- apps/meteor/package.json | 2 +- yarn.lock | 14 ++++++------- 4 files changed, 28 insertions(+), 12 deletions(-) diff --git a/apps/meteor/app/file-upload/ufs/Webdav/server.js b/apps/meteor/app/file-upload/ufs/Webdav/server.js index c635e38eb5858..7b2f8b95b64e0 100644 --- a/apps/meteor/app/file-upload/ufs/Webdav/server.js +++ b/apps/meteor/app/file-upload/ufs/Webdav/server.js @@ -76,7 +76,7 @@ export class WebdavStore extends UploadFS.Store { .then((data) => { callback && callback(null, data); }) - .catch(SystemLogger.error); + .catch((...args) => SystemLogger.error(...args)); }; /** @@ -107,7 +107,7 @@ export class WebdavStore extends UploadFS.Store { */ this.getWriteStream = function (fileId, file) { const writeStream = new stream.PassThrough(); - const webdavStream = client.createWriteStream(this.getPath(file)); + const webdavStream = client.createWriteStream(this.getPath(file), file.size || 0); // TODO remove timeout when UploadFS bug resolved const newListenerCallback = (event, listener) => { diff --git a/apps/meteor/app/webdav/server/lib/webdavClientAdapter.ts b/apps/meteor/app/webdav/server/lib/webdavClientAdapter.ts index f8462802bc6c7..43e9bb4642d77 100644 --- a/apps/meteor/app/webdav/server/lib/webdavClientAdapter.ts +++ b/apps/meteor/app/webdav/server/lib/webdavClientAdapter.ts @@ -1,3 +1,4 @@ +import stream from 'stream'; import type { Readable, Writable } from 'stream'; import type { WebDAVClient, FileStat, ResponseDataDetailed, WebDAVClientOptions } from 'webdav'; @@ -69,7 +70,22 @@ export class WebdavClientAdapter { return this._client.createReadStream(path, options); } - createWriteStream(path: string): Writable { - return this._client.createWriteStream(path); + createWriteStream(path: string, fileSize: number): Writable { + const ws = new stream.PassThrough(); + + this._client + .customRequest(path, { + method: 'PUT', + headers: { + ...(fileSize ? { 'Content-Length': String(fileSize) } : {}), + }, + data: ws, + maxRedirects: 0, + }) + .catch((err) => { + ws.emit('error', err); + }); + + return ws; } } diff --git a/apps/meteor/package.json b/apps/meteor/package.json index d545a0df13ec2..c441c888b7b4c 100644 --- a/apps/meteor/package.json +++ b/apps/meteor/package.json @@ -374,7 +374,7 @@ "use-sync-external-store": "^1.2.0", "uuid": "^8.3.2", "vm2": "^3.9.9", - "webdav": "^4.10.0", + "webdav": "^4.11.0", "xml-crypto": "^2.1.3", "xml-encryption": "2.0.0", "xml2js": "0.4.23", diff --git a/yarn.lock b/yarn.lock index 25380597bf4f6..0135aa0785f11 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4162,7 +4162,7 @@ __metadata: use-sync-external-store: ^1.2.0 uuid: ^8.3.2 vm2: ^3.9.9 - webdav: ^4.10.0 + webdav: ^4.11.0 webpack: ^4.46.0 xml-crypto: ^2.1.3 xml-encryption: 2.0.0 @@ -21860,7 +21860,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^5.0.1": +"minimatch@npm:^5.1.0": version: 5.1.0 resolution: "minimatch@npm:5.1.0" dependencies: @@ -31959,9 +31959,9 @@ __metadata: languageName: node linkType: hard -"webdav@npm:^4.10.0": - version: 4.10.0 - resolution: "webdav@npm:4.10.0" +"webdav@npm:^4.11.0": + version: 4.11.0 + resolution: "webdav@npm:4.11.0" dependencies: axios: ^0.27.2 base-64: ^1.0.0 @@ -31971,12 +31971,12 @@ __metadata: hot-patcher: ^0.5.0 layerr: ^0.1.2 md5: ^2.3.0 - minimatch: ^5.0.1 + minimatch: ^5.1.0 nested-property: ^4.0.0 path-posix: ^1.0.0 url-join: ^4.0.1 url-parse: ^1.5.10 - checksum: 0cfea9c233cfb8c490b6f6be01cb789f20fd01dbfe0ebc8f89057000390117a7cdbd55501c5fc248f54f2393d529cc60a058bf982d96e7e2507a7c99528444ab + checksum: 0a7aab0a3118deea20485d3c417fda40e71c3930b866a92cfff5dedce4a25c0fbed0cd083bf14ac5a4ee7cab55136265d5011b2601cbb2a1b359da551910ec97 languageName: node linkType: hard