From f3f7764dc2c61bb7897cc340f2a1544d87937461 Mon Sep 17 00:00:00 2001 From: hasezoey Date: Fri, 19 Apr 2024 15:21:23 +0200 Subject: [PATCH] feat: add option "DOWNLOAD_IGNORE_MISSING_HEADER" to ignore missing response-headers fixes #865 --- docs/api/config-options.md | 10 ++++++ .../src/util/MongoBinaryDownload.ts | 31 +++++++++++++++++-- .../src/util/resolveConfig.ts | 1 + 3 files changed, 40 insertions(+), 2 deletions(-) diff --git a/docs/api/config-options.md b/docs/api/config-options.md index ea51558b9..cc4a2f5ac 100644 --- a/docs/api/config-options.md +++ b/docs/api/config-options.md @@ -124,6 +124,16 @@ Option `DOWNLOAD_URL` is used to overwrite the ***complete*** URL (including [`D Format: `https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu1604-4.0.20.tgz` +### DOWNLOAD_IGNORE_MISSING_HEADER + +| Environment Variable | PackageJson | +| :--------------------: | :-----------: | +| `DOWNLOAD_IGNORE_MISSING_HEADER` | `downloadIgnoreMissingHeader` | + +Option `DOWNLOAD_IGNORE_MISSING_HEADER` can be set to `true` to ignore missing response headers like `content-length`. + +Default: `false` + ### PREFER_GLOBAL_PATH | Environment Variable | PackageJson | diff --git a/packages/mongodb-memory-server-core/src/util/MongoBinaryDownload.ts b/packages/mongodb-memory-server-core/src/util/MongoBinaryDownload.ts index 87dc4eb1a..f7213a302 100644 --- a/packages/mongodb-memory-server-core/src/util/MongoBinaryDownload.ts +++ b/packages/mongodb-memory-server-core/src/util/MongoBinaryDownload.ts @@ -399,14 +399,41 @@ export class MongoBinaryDownload { return; } + + // content-length, otherwise 0 + let contentLength: number; + if (typeof response.headers['content-length'] != 'string') { - reject(new DownloadError(downloadUrl, 'Response header "content-length" is empty!')); + log('Response header "content-lenght" is empty!'); + + contentLength = 0; + } else { + contentLength = parseInt(response.headers['content-length'], 10); + + if (Number.isNaN(contentLength)) { + log('Response header "content-lenght" resolved to NaN!'); + + contentLength = 0; + } + } + + // error if the content-length header is missing or is 0 if config option "DOWNLOAD_IGNORE_MISSING_HEADER" is not set to "true" + if ( + !envToBool(resolveConfig(ResolveConfigVariables.DOWNLOAD_IGNORE_MISSING_HEADER)) && + contentLength <= 0 + ) { + reject( + new DownloadError( + downloadUrl, + 'Response header "content-length" does not exist or resolved to NaN' + ) + ); return; } this.dlProgress.current = 0; - this.dlProgress.length = parseInt(response.headers['content-length'], 10); + this.dlProgress.length = contentLength; this.dlProgress.totalMb = Math.round((this.dlProgress.length / 1048576) * 10) / 10; const fileStream = createWriteStream(tempDownloadLocation); diff --git a/packages/mongodb-memory-server-core/src/util/resolveConfig.ts b/packages/mongodb-memory-server-core/src/util/resolveConfig.ts index 638179863..6ab7e372d 100644 --- a/packages/mongodb-memory-server-core/src/util/resolveConfig.ts +++ b/packages/mongodb-memory-server-core/src/util/resolveConfig.ts @@ -16,6 +16,7 @@ export enum ResolveConfigVariables { DEBUG = 'DEBUG', DOWNLOAD_MIRROR = 'DOWNLOAD_MIRROR', DOWNLOAD_URL = 'DOWNLOAD_URL', + DOWNLOAD_IGNORE_MISSING_HEADER = 'DOWNLOAD_IGNORE_MISSING_HEADER', PREFER_GLOBAL_PATH = 'PREFER_GLOBAL_PATH', DISABLE_POSTINSTALL = 'DISABLE_POSTINSTALL', SYSTEM_BINARY = 'SYSTEM_BINARY',