Skip to content

Commit 466f3b0

Browse files
authored
[INTERNAL] Properties File Escaping follow up (#219)
Use propertiesFileSourceEncoding configuration of the project the resource is originating from instead of the current root project.
1 parent 52df356 commit 466f3b0

File tree

3 files changed

+76
-77
lines changed

3 files changed

+76
-77
lines changed

lib/middleware/MiddlewareManager.js

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -108,16 +108,7 @@ class MiddlewareManager {
108108
await this.addMiddleware("discovery", {
109109
mountPath: "/discovery"
110110
});
111-
await this.addMiddleware("serveResources", {
112-
wrapperCallback: (serveResourcesModule) => {
113-
return ({resources}) => {
114-
return serveResourcesModule({
115-
resources,
116-
tree: this.tree
117-
});
118-
};
119-
}
120-
});
111+
await this.addMiddleware("serveResources");
121112
await this.addMiddleware("serveThemes");
122113
await this.addMiddleware("versionInfo", {
123114
mountPath: "/resources/sap-ui-version.json",

lib/middleware/serveResources.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ function isFresh(req, res) {
2323
* @param {module:@ui5/fs.AbstractReader} resources.all Resource collection which contains the workspace and the project dependencies
2424
* @returns {Function} Returns a server middleware closure.
2525
*/
26-
function createMiddleware({resources, tree: project}) {
26+
function createMiddleware({resources}) {
2727
return async function serveResources(req, res, next) {
2828
try {
2929
const pathname = parseurl(req).pathname;
@@ -43,7 +43,9 @@ function createMiddleware({resources, tree: project}) {
4343
if (rProperties.test(resourcePath)) {
4444
// Special handling for *.properties files escape non ascii characters.
4545
const nonAsciiEscaper = require("@ui5/builder").processors.nonAsciiEscaper;
46-
const propertiesFileSourceEncoding = project && project.resources && project.resources.configuration && project.resources.configuration.propertiesFileSourceEncoding;
46+
const project = resource._project; // _project might not be defined
47+
const propertiesFileSourceEncoding = project && project.resources &&
48+
project.resources.configuration && project.resources.configuration.propertiesFileSourceEncoding;
4749
const encoding = nonAsciiEscaper.getEncodingFromAlias(propertiesFileSourceEncoding || "ISO-8859-1");
4850
await nonAsciiEscaper({
4951
resources: [resource], options: {

test/lib/server/middleware/serveResources.js

Lines changed: 71 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ const test = require("ava");
22
const sinon = require("sinon");
33
const resourceFactory = require("@ui5/fs").resourceFactory;
44
const serveResourcesMiddleware = require("../../../../lib/middleware/serveResources");
5-
const writeResource = function(writer, path, size, stringContent) {
5+
const writeResource = function(writer, path, size, stringContent, project) {
66
const statInfo = {
77
ino: 0,
88
ctime: new Date(),
@@ -12,7 +12,12 @@ const writeResource = function(writer, path, size, stringContent) {
1212
return false;
1313
}
1414
};
15-
const resource = resourceFactory.createResource({path, buffer: Buffer.from(stringContent, "latin1"), statInfo});
15+
const resource = resourceFactory.createResource({
16+
path,
17+
buffer: Buffer.from(stringContent, "latin1"),
18+
statInfo,
19+
project
20+
});
1621
// stub resource functionality in order to be able to get the Resource's content. Otherwise it would be drained.
1722
sinon.stub(resource, "getStream").returns({
1823
pipe: function() {
@@ -32,89 +37,90 @@ test.afterEach.always((t) => {
3237
sinon.restore();
3338
});
3439

35-
3640
test.serial("Check if properties file is served properly", (t) => {
3741
t.plan(4);
3842

3943
const readerWriter = resourceFactory.createAdapter({virBasePath: "/"});
44+
const project = {
45+
resources: {
46+
configuration: {
47+
propertiesFileSourceEncoding: "ISO-8859-1"
48+
}
49+
}
50+
};
4051

41-
return writeResource(readerWriter, "/myFile3.properties", 1024 * 1024, "key=titel\nfame=straße").then((resource) => {
42-
const setStringSpy = sinon.spy(resource, "setString");
43-
const middleware = serveResourcesMiddleware({
44-
resources: {
45-
all: readerWriter
46-
},
47-
tree: {
52+
return writeResource(readerWriter, "/myFile3.properties", 1024 * 1024, "key=titel\nfame=straße", project)
53+
.then((resource) => {
54+
const setStringSpy = sinon.spy(resource, "setString");
55+
const middleware = serveResourcesMiddleware({
4856
resources: {
49-
configuration: {
50-
propertiesFileSourceEncoding: "ISO-8859-1"
51-
}
57+
all: readerWriter
5258
}
53-
}
54-
});
55-
56-
const response = fakeResponse;
57-
58-
const setHeaderSpy = sinon.spy(response, "setHeader");
59-
const req = {
60-
url: "/myFile3.properties",
61-
headers: {}
62-
};
63-
const next = function(err) {
64-
throw new Error(`Next callback called with error: ${err.message}`);
65-
};
66-
return middleware(req, response, next).then((o) => {
67-
return resource.getString();
68-
}).then((content) => {
69-
t.is(content, `key=titel
59+
});
60+
61+
const response = fakeResponse;
62+
63+
const setHeaderSpy = sinon.spy(response, "setHeader");
64+
const req = {
65+
url: "/myFile3.properties",
66+
headers: {}
67+
};
68+
const next = function(err) {
69+
throw new Error(`Next callback called with error: ${err.message}`);
70+
};
71+
return middleware(req, response, next).then((o) => {
72+
return resource.getString();
73+
}).then((content) => {
74+
t.is(content, `key=titel
7075
fame=stra\\u00dfe`);
71-
t.is(setHeaderSpy.callCount, 2);
72-
t.is(setStringSpy.callCount, 1);
73-
t.is(setHeaderSpy.getCall(0).lastArg, "application/octet-stream");
76+
t.is(setHeaderSpy.callCount, 2);
77+
t.is(setStringSpy.callCount, 1);
78+
t.is(setHeaderSpy.getCall(0).lastArg, "application/octet-stream");
79+
});
7480
});
75-
});
7681
});
7782

7883
test.serial("Check if properties file is served properly with UTF-8", (t) => {
7984
t.plan(4);
8085

8186
const readerWriter = resourceFactory.createAdapter({virBasePath: "/"});
87+
const project = {
88+
resources: {
89+
configuration: {
90+
propertiesFileSourceEncoding: "UTF-8"
91+
}
92+
}
93+
};
8294

83-
return writeResource(readerWriter, "/myFile3.properties", 1024 * 1024, "key=titel\nfame=straße").then((resource) => {
84-
const setStringSpy = sinon.spy(resource, "setString");
85-
const middleware = serveResourcesMiddleware({
86-
resources: {
87-
all: readerWriter
88-
},
89-
tree: {
95+
return writeResource(readerWriter, "/myFile3.properties", 1024 * 1024, "key=titel\nfame=straße", project)
96+
.then((resource) => {
97+
const setStringSpy = sinon.spy(resource, "setString");
98+
const middleware = serveResourcesMiddleware({
9099
resources: {
91-
configuration: {
92-
propertiesFileSourceEncoding: "UTF-8"
93-
}
100+
all: readerWriter
94101
}
95-
}
96-
});
97-
98-
const response = fakeResponse;
99-
100-
const setHeaderSpy = sinon.spy(response, "setHeader");
101-
const req = {
102-
url: "/myFile3.properties",
103-
headers: {}
104-
};
105-
const next = function(err) {
106-
throw new Error(`Next callback called with error: ${err.message}`);
107-
};
108-
return middleware(req, response, next).then((o) => {
109-
return resource.getString();
110-
}).then((content) => {
111-
t.is(content, `key=titel
102+
});
103+
104+
const response = fakeResponse;
105+
106+
const setHeaderSpy = sinon.spy(response, "setHeader");
107+
const req = {
108+
url: "/myFile3.properties",
109+
headers: {}
110+
};
111+
const next = function(err) {
112+
throw new Error(`Next callback called with error: ${err.message}`);
113+
};
114+
return middleware(req, response, next).then((o) => {
115+
return resource.getString();
116+
}).then((content) => {
117+
t.is(content, `key=titel
112118
fame=stra\\ufffde`);
113-
t.is(setHeaderSpy.callCount, 2);
114-
t.is(setStringSpy.callCount, 1);
115-
t.is(setHeaderSpy.getCall(0).lastArg, "application/octet-stream");
119+
t.is(setHeaderSpy.callCount, 2);
120+
t.is(setStringSpy.callCount, 1);
121+
t.is(setHeaderSpy.getCall(0).lastArg, "application/octet-stream");
122+
});
116123
});
117-
});
118124
});
119125

120126
test.serial("Check if properties file is served properly without property setting", (t) => {

0 commit comments

Comments
 (0)