summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBradley Farias <bfarias@godaddy.com>2019-11-22 10:34:31 -0600
committerBradley Farias <bfarias@godaddy.com>2019-11-26 11:00:33 -0600
commit568968e39bff623e30b71f4eaf20f3a471bbc8be (patch)
tree11643fde62d36190b0680ce973a2bfd074ae890f
parent8c41b19619d1241543047ceee85931647257c5cc (diff)
downloadandroid-node-v8-568968e39bff623e30b71f4eaf20f3a471bbc8be.tar.gz
android-node-v8-568968e39bff623e30b71f4eaf20f3a471bbc8be.tar.bz2
android-node-v8-568968e39bff623e30b71f4eaf20f3a471bbc8be.zip
esm: data URLs should ignore unknown parameters
PR-URL: https://github.com/nodejs/node/pull/30593 Reviewed-By: Jan Krems <jan.krems@gmail.com> Reviewed-By: Guy Bedford <guybedford@gmail.com>
-rw-r--r--lib/internal/modules/esm/default_resolve.js2
-rw-r--r--lib/internal/modules/esm/translators.js2
-rw-r--r--test/es-module/test-esm-data-urls.js41
3 files changed, 43 insertions, 2 deletions
diff --git a/lib/internal/modules/esm/default_resolve.js b/lib/internal/modules/esm/default_resolve.js
index a0d9a14dda..169c6f3569 100644
--- a/lib/internal/modules/esm/default_resolve.js
+++ b/lib/internal/modules/esm/default_resolve.js
@@ -55,7 +55,7 @@ function resolve(specifier, parentURL) {
try {
const parsed = new URL(specifier);
if (parsed.protocol === 'data:') {
- const [ , mime ] = /^([^/]+\/[^;,]+)(;base64)?,/.exec(parsed.pathname) || [ null, null, null ];
+ const [ , mime ] = /^([^/]+\/[^;,]+)(?:[^,]*?)(;base64)?,/.exec(parsed.pathname) || [ null, null, null ];
const format = ({
'__proto__': null,
'text/javascript': 'module',
diff --git a/lib/internal/modules/esm/translators.js b/lib/internal/modules/esm/translators.js
index d4103ab9cd..dafc1b02f0 100644
--- a/lib/internal/modules/esm/translators.js
+++ b/lib/internal/modules/esm/translators.js
@@ -38,7 +38,7 @@ const debug = debuglog('esm');
const translators = new SafeMap();
exports.translators = translators;
-const DATA_URL_PATTERN = /^[^/]+\/[^,;]+(;base64)?,([\s\S]*)$/;
+const DATA_URL_PATTERN = /^[^/]+\/[^,;]+(?:[^,]*?)(;base64)?,([\s\S]*)$/;
function getSource(url) {
const parsed = new URL(url);
if (parsed.protocol === 'file:') {
diff --git a/test/es-module/test-esm-data-urls.js b/test/es-module/test-esm-data-urls.js
index f2f166b47e..7efe7a1199 100644
--- a/test/es-module/test-esm-data-urls.js
+++ b/test/es-module/test-esm-data-urls.js
@@ -36,6 +36,47 @@ function createBase64URL(mime, body) {
assert.deepStrictEqual(ns.default, plainESMURL);
}
{
+ const body = 'export default import.meta.url;';
+ const plainESMURL = createURL('text/javascript;charset=UTF-8', body);
+ const ns = await import(plainESMURL);
+ assert.deepStrictEqual(Object.keys(ns), ['default']);
+ assert.deepStrictEqual(ns.default, plainESMURL);
+ }
+ {
+ const body = 'export default import.meta.url;';
+ const plainESMURL = createURL('text/javascript;charset="UTF-8"', body);
+ const ns = await import(plainESMURL);
+ assert.deepStrictEqual(Object.keys(ns), ['default']);
+ assert.deepStrictEqual(ns.default, plainESMURL);
+ }
+ {
+ const body = 'export default import.meta.url;';
+ const plainESMURL = createURL('text/javascript;;a=a;b=b;;', body);
+ const ns = await import(plainESMURL);
+ assert.deepStrictEqual(Object.keys(ns), ['default']);
+ assert.deepStrictEqual(ns.default, plainESMURL);
+ }
+ {
+ const ns = await import('data:application/json;foo="test,"this"');
+ assert.deepStrictEqual(Object.keys(ns), ['default']);
+ assert.deepStrictEqual(ns.default, 'this');
+ }
+ {
+ const ns = await import(`data:application/json;foo=${
+ encodeURIComponent('test,')
+ },0`);
+ assert.deepStrictEqual(Object.keys(ns), ['default']);
+ assert.deepStrictEqual(ns.default, 0);
+ }
+ {
+ await assert.rejects(async () => {
+ return import('data:application/json;foo="test,",0');
+ }, {
+ name: 'SyntaxError',
+ message: /Unexpected end of JSON input/
+ });
+ }
+ {
const body = '{"x": 1}';
const plainESMURL = createURL('application/json', body);
const ns = await import(plainESMURL);