diff options
author | Bradley Farias <bradley.meck@gmail.com> | 2017-07-31 17:02:23 -0500 |
---|---|---|
committer | Bradley Farias <bradley.meck@gmail.com> | 2017-07-31 17:02:23 -0500 |
commit | 375d4a7385544d9a85de77e8fbbecebf0d5e6861 (patch) | |
tree | cf0d6e42296b8ae2cbcaccafc0f19f3c3f3b9ba3 | |
parent | 48d3401f195a3127c6343f364d92ea038e135e48 (diff) | |
download | node-new-pull/14369/head.tar.gz |
properly decode url encoding in pathnamespull/14369/head
-rw-r--r-- | lib/internal/loader/resolveRequestUrl.js | 12 | ||||
-rw-r--r-- | src/module_wrap.cc | 2 | ||||
-rw-r--r-- | src/node_url.cc | 11 | ||||
-rw-r--r-- | src/node_url.h | 2 | ||||
-rw-r--r-- | test/es-module/test-esm-url-native.js | 11 | ||||
-rw-r--r-- | test/es-module/test-esm-url-pathname.js | 11 | ||||
-rw-r--r-- | test/fixtures/es-module-url/empty.js | 0 | ||||
-rw-r--r-- | test/fixtures/es-module-url/native.mjs | 2 | ||||
-rw-r--r-- | test/fixtures/es-module-url/pathname.mjs | 2 |
9 files changed, 47 insertions, 6 deletions
diff --git a/lib/internal/loader/resolveRequestUrl.js b/lib/internal/loader/resolveRequestUrl.js index 6e1c3d1c3a..709906e785 100644 --- a/lib/internal/loader/resolveRequestUrl.js +++ b/lib/internal/loader/resolveRequestUrl.js @@ -2,6 +2,7 @@ const { URL } = require('url'); const internalCJSModule = require('internal/module'); +const internalURLModule = require('internal/url'); const NativeModule = require('native_module'); const { extname } = require('path'); @@ -68,7 +69,7 @@ Object.setPrototypeOf(ModuleRequest.prototype, null); // Strategy for loading a standard JavaScript module class StandardModuleRequest extends ModuleRequest { async createModule() { - const source = `${await asyncReadFile(this.url.pathname)}`; + const source = `${await asyncReadFile(this.url)}`; debug(`Loading StandardModule ${this.url}`); return new ModuleWrap(internalCJSModule.stripShebang(source), `${this.url}`); @@ -80,9 +81,10 @@ class CJSModuleRequest extends ModuleRequest { async createModule() { const ctx = createDynamicModule(['default'], this.url, (reflect) => { const CJSModule = require('module'); - debug(`Loading CJSModule ${this.url.pathname}`); - const cjs = new CJSModule(this.url.pathname, process.mainModule); - cjs.load(this.url.pathname); + const pathname = internalURLModule.getPathFromURL(this.url); + debug(`Loading CJSModule ${pathname}`); + const cjs = new CJSModule(pathname, process.mainModule); + cjs.load(pathname); reflect.exports.default.set(cjs.exports); }); return ctx.module; @@ -114,7 +116,7 @@ const resolveRequestUrl = (baseURLOrString, specifier) => { } const baseURL = normalizeBaseURL(baseURLOrString); - const url = search(specifier, baseURL); + let url = search(specifier, baseURL); if (url.protocol !== 'file:') { throw new Error('Module must be on file: protocol'); diff --git a/src/module_wrap.cc b/src/module_wrap.cc index 1342fd0393..ca4e22b0e7 100644 --- a/src/module_wrap.cc +++ b/src/module_wrap.cc @@ -332,7 +332,7 @@ inline const struct file_check check_file(URL search, bool allow_dir = false) { struct file_check ret; uv_fs_t fs_req; - uv_fs_open(nullptr, &fs_req, search.path().c_str(), O_RDONLY, 0, nullptr); + uv_fs_open(nullptr, &fs_req, search.decoded_path().c_str(), O_RDONLY, 0, nullptr); auto fd = fs_req.result; if (fd < 0) { return ret; diff --git a/src/node_url.cc b/src/node_url.cc index 75f262bad5..d961b9ede0 100644 --- a/src/node_url.cc +++ b/src/node_url.cc @@ -886,6 +886,17 @@ static url_host_type ParseHost(url_host* host, return type; } +std::string node::url::URL::decoded_path() { + std::string ret; + for (auto i = context_.path.begin(); i != context_.path.end(); i++) { + ret += '/'; + std::string tmp; + PercentDecode(i->c_str(), i->length(), &tmp); + ret += tmp; + } + return ret; +} + // Locates the longest sequence of 0 segments in an IPv6 address // in order to use the :: compression when serializing static inline uint16_t* FindLongestZeroSequence(uint16_t* values, diff --git a/src/node_url.h b/src/node_url.h index 72ac366ec1..fbe7683a49 100644 --- a/src/node_url.h +++ b/src/node_url.h @@ -163,6 +163,8 @@ class URL { return ret; } + std::string decoded_path(); + const Local<Value> ToObject(Environment* env) const; private: diff --git a/test/es-module/test-esm-url-native.js b/test/es-module/test-esm-url-native.js new file mode 100644 index 0000000000..9fe2cb81d8 --- /dev/null +++ b/test/es-module/test-esm-url-native.js @@ -0,0 +1,11 @@ +'use strict'; +const common = require('../common'); +const assert= require('assert'); +const child_process = require('child_process'); + +const native = `${common.fixturesDir}/es-module-url/native.mjs`; +child_process.spawn(process.execPath, [ + native +]).on('exit', (code) => { + assert.equal(code, 1); +}); diff --git a/test/es-module/test-esm-url-pathname.js b/test/es-module/test-esm-url-pathname.js new file mode 100644 index 0000000000..b4d7e07064 --- /dev/null +++ b/test/es-module/test-esm-url-pathname.js @@ -0,0 +1,11 @@ +'use strict'; +const common = require('../common'); +const assert= require('assert'); +const child_process = require('child_process'); + +const pathname = `${common.fixturesDir}/es-module-url/pathname.mjs`; +child_process.spawn(process.execPath, [ + pathname +]).on('exit', (code) => { + assert.equal(code, 0); +}).stderr.pipe(process.stderr) diff --git a/test/fixtures/es-module-url/empty.js b/test/fixtures/es-module-url/empty.js new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/test/fixtures/es-module-url/empty.js diff --git a/test/fixtures/es-module-url/native.mjs b/test/fixtures/es-module-url/native.mjs new file mode 100644 index 0000000000..c8831f9bfe --- /dev/null +++ b/test/fixtures/es-module-url/native.mjs @@ -0,0 +1,2 @@ +// path +import 'p%61th'; diff --git a/test/fixtures/es-module-url/pathname.mjs b/test/fixtures/es-module-url/pathname.mjs new file mode 100644 index 0000000000..bd11371e4e --- /dev/null +++ b/test/fixtures/es-module-url/pathname.mjs @@ -0,0 +1,2 @@ +// ./empty +import './%65mpty.js'; |