diff --git a/lib/middleware/MiddlewareManager.js b/lib/middleware/MiddlewareManager.js index a6ac2001..e3c6b04d 100644 --- a/lib/middleware/MiddlewareManager.js +++ b/lib/middleware/MiddlewareManager.js @@ -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", diff --git a/lib/middleware/serveResources.js b/lib/middleware/serveResources.js index 62e88a15..50c02e45 100644 --- a/lib/middleware/serveResources.js +++ b/lib/middleware/serveResources.js @@ -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; @@ -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: { diff --git a/test/lib/server/middleware/serveResources.js b/test/lib/server/middleware/serveResources.js index 542aacc8..65b60ee3 100644 --- a/test/lib/server/middleware/serveResources.js +++ b/test/lib/server/middleware/serveResources.js @@ -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(), @@ -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() { @@ -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) => {