summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBradley Farias <bradley.meck@gmail.com>2017-07-31 17:02:23 -0500
committerBradley Farias <bradley.meck@gmail.com>2017-07-31 17:02:23 -0500
commit375d4a7385544d9a85de77e8fbbecebf0d5e6861 (patch)
treecf0d6e42296b8ae2cbcaccafc0f19f3c3f3b9ba3
parent48d3401f195a3127c6343f364d92ea038e135e48 (diff)
downloadnode-new-pull/14369/head.tar.gz
properly decode url encoding in pathnamespull/14369/head
-rw-r--r--lib/internal/loader/resolveRequestUrl.js12
-rw-r--r--src/module_wrap.cc2
-rw-r--r--src/node_url.cc11
-rw-r--r--src/node_url.h2
-rw-r--r--test/es-module/test-esm-url-native.js11
-rw-r--r--test/es-module/test-esm-url-pathname.js11
-rw-r--r--test/fixtures/es-module-url/empty.js0
-rw-r--r--test/fixtures/es-module-url/native.mjs2
-rw-r--r--test/fixtures/es-module-url/pathname.mjs2
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';