Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 1 addition & 10 deletions lib/middleware/MiddlewareManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -108,16 +108,7 @@ class MiddlewareManager {
await this.addMiddleware("discovery", {
mountPath: "/discovery"
});
await this.addMiddleware("serveResources", {
wrapperCallback: (serveResourcesModule) => {
return ({resources}) => {
return serveResourcesModule({
resources,
tree: this.tree
});
};
}
});
await this.addMiddleware("serveResources");
await this.addMiddleware("serveThemes");
await this.addMiddleware("versionInfo", {
mountPath: "/resources/sap-ui-version.json",
Expand Down
6 changes: 4 additions & 2 deletions lib/middleware/serveResources.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ function isFresh(req, res) {
* @param {module:@ui5/fs.AbstractReader} resources.all Resource collection which contains the workspace and the project dependencies
* @returns {Function} Returns a server middleware closure.
*/
function createMiddleware({resources, tree: project}) {
function createMiddleware({resources}) {
return async function serveResources(req, res, next) {
try {
const pathname = parseurl(req).pathname;
Expand All @@ -43,7 +43,9 @@ function createMiddleware({resources, tree: project}) {
if (rProperties.test(resourcePath)) {
// Special handling for *.properties files escape non ascii characters.
const nonAsciiEscaper = require("@ui5/builder").processors.nonAsciiEscaper;
const propertiesFileSourceEncoding = project && project.resources && project.resources.configuration && project.resources.configuration.propertiesFileSourceEncoding;
const project = resource._project; // _project might not be defined
const propertiesFileSourceEncoding = project && project.resources &&
project.resources.configuration && project.resources.configuration.propertiesFileSourceEncoding;
const encoding = nonAsciiEscaper.getEncodingFromAlias(propertiesFileSourceEncoding || "ISO-8859-1");
await nonAsciiEscaper({
resources: [resource], options: {
Expand Down
136 changes: 71 additions & 65 deletions test/lib/server/middleware/serveResources.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ const test = require("ava");
const sinon = require("sinon");
const resourceFactory = require("@ui5/fs").resourceFactory;
const serveResourcesMiddleware = require("../../../../lib/middleware/serveResources");
const writeResource = function(writer, path, size, stringContent) {
const writeResource = function(writer, path, size, stringContent, project) {
const statInfo = {
ino: 0,
ctime: new Date(),
Expand All @@ -12,7 +12,12 @@ const writeResource = function(writer, path, size, stringContent) {
return false;
}
};
const resource = resourceFactory.createResource({path, buffer: Buffer.from(stringContent, "latin1"), statInfo});
const resource = resourceFactory.createResource({
path,
buffer: Buffer.from(stringContent, "latin1"),
statInfo,
project
});
// stub resource functionality in order to be able to get the Resource's content. Otherwise it would be drained.
sinon.stub(resource, "getStream").returns({
pipe: function() {
Expand All @@ -32,89 +37,90 @@ test.afterEach.always((t) => {
sinon.restore();
});


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

const readerWriter = resourceFactory.createAdapter({virBasePath: "/"});
const project = {
resources: {
configuration: {
propertiesFileSourceEncoding: "ISO-8859-1"
}
}
};

return writeResource(readerWriter, "/myFile3.properties", 1024 * 1024, "key=titel\nfame=straße").then((resource) => {
const setStringSpy = sinon.spy(resource, "setString");
const middleware = serveResourcesMiddleware({
resources: {
all: readerWriter
},
tree: {
return writeResource(readerWriter, "/myFile3.properties", 1024 * 1024, "key=titel\nfame=straße", project)
.then((resource) => {
const setStringSpy = sinon.spy(resource, "setString");
const middleware = serveResourcesMiddleware({
resources: {
configuration: {
propertiesFileSourceEncoding: "ISO-8859-1"
}
all: readerWriter
}
}
});

const response = fakeResponse;

const setHeaderSpy = sinon.spy(response, "setHeader");
const req = {
url: "/myFile3.properties",
headers: {}
};
const next = function(err) {
throw new Error(`Next callback called with error: ${err.message}`);
};
return middleware(req, response, next).then((o) => {
return resource.getString();
}).then((content) => {
t.is(content, `key=titel
});

const response = fakeResponse;

const setHeaderSpy = sinon.spy(response, "setHeader");
const req = {
url: "/myFile3.properties",
headers: {}
};
const next = function(err) {
throw new Error(`Next callback called with error: ${err.message}`);
};
return middleware(req, response, next).then((o) => {
return resource.getString();
}).then((content) => {
t.is(content, `key=titel
fame=stra\\u00dfe`);
t.is(setHeaderSpy.callCount, 2);
t.is(setStringSpy.callCount, 1);
t.is(setHeaderSpy.getCall(0).lastArg, "application/octet-stream");
t.is(setHeaderSpy.callCount, 2);
t.is(setStringSpy.callCount, 1);
t.is(setHeaderSpy.getCall(0).lastArg, "application/octet-stream");
});
});
});
});

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

const readerWriter = resourceFactory.createAdapter({virBasePath: "/"});
const project = {
resources: {
configuration: {
propertiesFileSourceEncoding: "UTF-8"
}
}
};

return writeResource(readerWriter, "/myFile3.properties", 1024 * 1024, "key=titel\nfame=straße").then((resource) => {
const setStringSpy = sinon.spy(resource, "setString");
const middleware = serveResourcesMiddleware({
resources: {
all: readerWriter
},
tree: {
return writeResource(readerWriter, "/myFile3.properties", 1024 * 1024, "key=titel\nfame=straße", project)
.then((resource) => {
const setStringSpy = sinon.spy(resource, "setString");
const middleware = serveResourcesMiddleware({
resources: {
configuration: {
propertiesFileSourceEncoding: "UTF-8"
}
all: readerWriter
}
}
});

const response = fakeResponse;

const setHeaderSpy = sinon.spy(response, "setHeader");
const req = {
url: "/myFile3.properties",
headers: {}
};
const next = function(err) {
throw new Error(`Next callback called with error: ${err.message}`);
};
return middleware(req, response, next).then((o) => {
return resource.getString();
}).then((content) => {
t.is(content, `key=titel
});

const response = fakeResponse;

const setHeaderSpy = sinon.spy(response, "setHeader");
const req = {
url: "/myFile3.properties",
headers: {}
};
const next = function(err) {
throw new Error(`Next callback called with error: ${err.message}`);
};
return middleware(req, response, next).then((o) => {
return resource.getString();
}).then((content) => {
t.is(content, `key=titel
fame=stra\\ufffde`);
t.is(setHeaderSpy.callCount, 2);
t.is(setStringSpy.callCount, 1);
t.is(setHeaderSpy.getCall(0).lastArg, "application/octet-stream");
t.is(setHeaderSpy.callCount, 2);
t.is(setStringSpy.callCount, 1);
t.is(setHeaderSpy.getCall(0).lastArg, "application/octet-stream");
});
});
});
});

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