diff options
author | Bradley Farias <bfarias@godaddy.com> | 2019-11-22 10:34:31 -0600 |
---|---|---|
committer | Bradley Farias <bfarias@godaddy.com> | 2019-11-26 11:00:33 -0600 |
commit | 568968e39bff623e30b71f4eaf20f3a471bbc8be (patch) | |
tree | 11643fde62d36190b0680ce973a2bfd074ae890f | |
parent | 8c41b19619d1241543047ceee85931647257c5cc (diff) | |
download | android-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.js | 2 | ||||
-rw-r--r-- | lib/internal/modules/esm/translators.js | 2 | ||||
-rw-r--r-- | test/es-module/test-esm-data-urls.js | 41 |
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); |