Skip to content

Commit 256b3f0

Browse files
committed
[FIX] Handle encoding in request paths correctly
Use new MiddlewareUtil to correctly parse the pathname of an incoming request so that for example %20 becomes a whitespace.
1 parent b8ab775 commit 256b3f0

File tree

7 files changed

+28
-17
lines changed

7 files changed

+28
-17
lines changed

lib/middleware/serveIndex.js

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,10 +93,11 @@ function createResourceInfos(resources) {
9393
* @returns {Function} Returns a server middleware closure.
9494
*/
9595

96-
function createMiddleware({resources, simpleIndex = false, showHidden = true}) {
96+
function createMiddleware({resources, middlewareUtil, simpleIndex = false, showHidden = true}) {
9797
return function(req, res, next) {
98-
log.verbose("\n Listing index of " + req.path);
99-
const glob = req.path + (req.path.endsWith("/") ? "*" : "/*");
98+
const pathname = middlewareUtil.getPathname(req);
99+
log.verbose("\n Listing index of " + pathname);
100+
const glob = pathname + (pathname.endsWith("/") ? "*" : "/*");
100101
resources.all.byGlob(glob, {nodir: false}).then((resources) => {
101102
if (!resources || resources.length === 0) { // Not found
102103
next();
@@ -110,7 +111,8 @@ function createMiddleware({resources, simpleIndex = false, showHidden = true}) {
110111
next,
111112
simpleIndex,
112113
showHidden,
113-
resourceInfos
114+
resourceInfos,
115+
pathname
114116
});
115117
}).catch((err) => {
116118
next(err);

lib/middleware/serveIndex/serveIndex.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -374,7 +374,7 @@ const icons = {
374374
".yaws": "page_white_code.png"
375375
};
376376

377-
function handleRequest({req, res, next, showHidden, simpleIndex, resourceInfos}) {
377+
function handleRequest({req, res, next, showHidden, simpleIndex, resourceInfos, pathname}) {
378378
const hidden = showHidden; // display hidden files
379379
const view = simpleIndex ? "tiles" : "details";
380380

@@ -395,7 +395,7 @@ function handleRequest({req, res, next, showHidden, simpleIndex, resourceInfos})
395395

396396
// create locals for rendering
397397
const locals = {
398-
directory: req.path,
398+
directory: pathname,
399399
fileList: resourceInfos,
400400
path: path,
401401
style: style,

lib/middleware/serveResources.js

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
const log = require("@ui5/logger").getLogger("server:middleware:serveResources");
2-
const {getMimeInfo} = require("../mime-util");
32
const replaceStream = require("replacestream");
43
const etag = require("etag");
54
const fresh = require("fresh");
6-
const parseurl = require("parseurl");
75

86
const rProperties = /\.properties$/i;
97
const rReplaceVersion = /\.(library|js|json)$/i;
@@ -24,10 +22,10 @@ function isFresh(req, res) {
2422
* @param {module:@ui5/fs.AbstractReader} parameters.resources.all Resource collection which contains the workspace and the project dependencies
2523
* @returns {Function} Returns a server middleware closure.
2624
*/
27-
function createMiddleware({resources}) {
25+
function createMiddleware({resources, middlewareUtil}) {
2826
return async function serveResources(req, res, next) {
2927
try {
30-
const pathname = parseurl(req).pathname;
28+
const pathname = middlewareUtil.getPathname(req);
3129
const resource = await resources.all.byPath(pathname);
3230
if (!resource) { // Not found
3331
next();
@@ -53,7 +51,7 @@ function createMiddleware({resources}) {
5351
});
5452
}
5553

56-
const {contentType, charset} = getMimeInfo(resourcePath);
54+
const {contentType, charset} = middlewareUtil.getMimeInfo(resourcePath);
5755
if (!res.getHeader("Content-Type")) {
5856
res.setHeader("Content-Type", contentType);
5957
}

lib/middleware/serveThemes.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
const themeBuilder = require("@ui5/builder").processors.themeBuilder;
22
const fsInterface = require("@ui5/fs").fsInterface;
3-
const {getMimeInfo} = require("../mime-util");
43
const {basename, dirname} = require("path").posix;
54
const etag = require("etag");
65
const fresh = require("fresh");
@@ -39,7 +38,7 @@ const themeResources = [
3938
* @param {module:@ui5/fs.AbstractReader} parameters.resources.all Resource collection which contains the workspace and the project dependencies
4039
* @returns {Function} Returns a server middleware closure.
4140
*/
42-
function createMiddleware({resources}) {
41+
function createMiddleware({resources, middlewareUtil}) {
4342
const builder = new themeBuilder.ThemeBuilder({
4443
fs: fsInterface(resources.all)
4544
});
@@ -77,7 +76,7 @@ function createMiddleware({resources}) {
7776
}
7877

7978
const resourcePath = resource.getPath();
80-
const {contentType} = getMimeInfo(resourcePath);
79+
const {contentType} = middlewareUtil.getMimeInfo(resourcePath);
8180
res.setHeader("Content-Type", contentType);
8281

8382
const content = await resource.getBuffer();

test/lib/server/middleware/serveIndex.js

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
const test = require("ava");
22
const resourceFactory = require("@ui5/fs").resourceFactory;
3+
const MiddlewareUtil = require("../../../../lib/middleware/MiddlewareUtil");
34

45
test.serial("serveIndex default", (t) => {
56
t.plan(4);
@@ -27,14 +28,15 @@ test.serial("serveIndex default", (t) => {
2728
writeResource(readerWriter, "/.myFile4", 1024), // hidden 1 KB
2829
]).then(() => {
2930
const middleware = serveIndexMiddleware({
31+
middlewareUtil: new MiddlewareUtil(),
3032
resources: {
3133
all: readerWriter
3234
}
3335
});
3436

3537
return new Promise((resolve, reject) => {
3638
const req = {
37-
path: "/"
39+
url: "/"
3840
};
3941
const res = {
4042
writeHead: function(status, contentType) {
@@ -81,6 +83,7 @@ test.serial("serveIndex no hidden", (t) => {
8183
writeResource(readerWriter, "/.myFile4", 1024), // hidden 1 KB
8284
]).then(() => {
8385
const middleware = serveIndexMiddleware({
86+
middlewareUtil: new MiddlewareUtil(),
8487
resources: {
8588
all: readerWriter
8689
},
@@ -90,7 +93,7 @@ test.serial("serveIndex no hidden", (t) => {
9093

9194
return new Promise((resolve, reject) => {
9295
const req = {
93-
path: "/"
96+
url: "/"
9497
};
9598
const res = {
9699
writeHead: function(status, contentType) {
@@ -137,6 +140,7 @@ test.serial("serveIndex no details", (t) => {
137140
writeResource(readerWriter, "/.myFile4", 1024), // hidden 1 KB
138141
]).then(() => {
139142
const middleware = serveIndexMiddleware({
143+
middlewareUtil: new MiddlewareUtil(),
140144
resources: {
141145
all: readerWriter
142146
},
@@ -146,7 +150,7 @@ test.serial("serveIndex no details", (t) => {
146150

147151
return new Promise((resolve, reject) => {
148152
const req = {
149-
path: "/"
153+
url: "/"
150154
};
151155
const res = {
152156
writeHead: function(status, contentType) {

test/lib/server/middleware/serveResources.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ const sinon = require("sinon");
33
const {Readable, Writable} = require("stream");
44
const resourceFactory = require("@ui5/fs").resourceFactory;
55
const serveResourcesMiddleware = require("../../../../lib/middleware/serveResources");
6+
const MiddlewareUtil = require("../../../../lib/middleware/MiddlewareUtil");
67
const writeResource = function(writer, path, size, stringContent, project) {
78
const statInfo = {
89
ino: 0,
@@ -54,6 +55,7 @@ test.serial("Check if properties file is served properly", (t) => {
5455
.then((resource) => {
5556
const setStringSpy = sinon.spy(resource, "setString");
5657
const middleware = serveResourcesMiddleware({
58+
middlewareUtil: new MiddlewareUtil(),
5759
resources: {
5860
all: readerWriter
5961
}
@@ -97,6 +99,7 @@ test.serial("Check if properties file is served properly with UTF-8", (t) => {
9799
.then((resource) => {
98100
const setStringSpy = sinon.spy(resource, "setString");
99101
const middleware = serveResourcesMiddleware({
102+
middlewareUtil: new MiddlewareUtil(),
100103
resources: {
101104
all: readerWriter
102105
}
@@ -132,6 +135,7 @@ test.serial("Check if properties file is served properly without property settin
132135
return writeResource(readerWriter, "/myFile3.properties", 1024 * 1024, "key=titel\nfame=straße").then((resource) => {
133136
const setStringSpy = sinon.spy(resource, "setString");
134137
const middleware = serveResourcesMiddleware({
138+
middlewareUtil: new MiddlewareUtil(),
135139
resources: {
136140
all: readerWriter
137141
}
@@ -191,6 +195,7 @@ test.serial.cb("Check if version replacement is done", (t) => {
191195
}
192196
};
193197
const middleware = serveResourcesMiddleware({
198+
middlewareUtil: new MiddlewareUtil(),
194199
resources
195200
});
196201

@@ -266,6 +271,7 @@ test.serial[
266271
}
267272
};
268273
const middleware = serveResourcesMiddleware({
274+
middlewareUtil: new MiddlewareUtil(),
269275
resources
270276
});
271277

test/lib/server/middleware/serveThemes.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ const sinon = require("sinon");
33
const mock = require("mock-require");
44

55
const ThemeBuilder = require("@ui5/builder").processors.themeBuilder.ThemeBuilder;
6+
const MiddlewareUtil = require("../../../../lib/middleware/MiddlewareUtil");
67

78
const failOnNext= function(t) {
89
return function(err) {
@@ -82,6 +83,7 @@ const createMiddleware = function() {
8283
};
8384
return {
8485
middleware: require("../../../../lib/middleware/serveThemes")({
86+
middlewareUtil: new MiddlewareUtil(),
8587
resources
8688
}),
8789
byPath: resources.all.byPath

0 commit comments

Comments
 (0)