From 114e4c8786755a74c1135fd58702f07d9a349c18 Mon Sep 17 00:00:00 2001 From: Antoine du Hamel Date: Wed, 10 Mar 2021 23:20:38 +0100 Subject: [PATCH] module: improve error message for invalid data URL Fixes: https://github.com/nodejs/node/issues/37647 --- lib/internal/modules/esm/loader.js | 8 ++++++++ test/es-module/test-esm-invalid-data-urls.js | 18 ++++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 test/es-module/test-esm-invalid-data-urls.js diff --git a/lib/internal/modules/esm/loader.js b/lib/internal/modules/esm/loader.js index 232177698c73f6..b52db6cdc4db1f 100644 --- a/lib/internal/modules/esm/loader.js +++ b/lib/internal/modules/esm/loader.js @@ -6,6 +6,7 @@ require('internal/modules/cjs/loader'); const { FunctionPrototypeBind, ObjectSetPrototypeOf, + RegExpPrototypeExec, SafeWeakMap, StringPrototypeStartsWith, } = primordials; @@ -107,6 +108,13 @@ class Loader { } const { format } = getFormatResponse; + if(format === null) { + const dataUrl = RegExpPrototypeExec( + /^data:([^/]+\/[^;,]+)(?:[^,]*?)(;base64)?,/, + url, + ); + throw new ERR_UNKNOWN_MODULE_FORMAT(dataUrl ? dataUrl[1] : 'null'); + } if (typeof format !== 'string') { throw new ERR_INVALID_RETURN_PROPERTY_VALUE( 'string', 'loader getFormat', 'format', format); diff --git a/test/es-module/test-esm-invalid-data-urls.js b/test/es-module/test-esm-invalid-data-urls.js new file mode 100644 index 00000000000000..caf8547422be3d --- /dev/null +++ b/test/es-module/test-esm-invalid-data-urls.js @@ -0,0 +1,18 @@ +'use strict'; +const common = require('../common'); +const assert = require('assert'); + +(async () => { + await assert.rejects(import(`data:text/plain,export default0`), { + code: 'ERR_UNKNOWN_MODULE_FORMAT', + message: 'Unknown module format: text/plain', + }); + await assert.rejects(import(`data:text/plain;base64,`), { + code: 'ERR_UNKNOWN_MODULE_FORMAT', + message: 'Unknown module format: text/plain', + }); + await assert.rejects(import('data:application/json,[]'), { + code: 'ERR_UNKNOWN_MODULE_FORMAT', + message: 'Unknown module format: application/json', + }); +})().then(common.mustCall());