Skip to content

Commit 779f6e1

Browse files
committed
[INTERNAL] testRunner middleware: Use ETag caching
1 parent e3da348 commit 779f6e1

File tree

1 file changed

+31
-8
lines changed

1 file changed

+31
-8
lines changed

lib/middleware/testRunner.js

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,43 @@ const path = require("path");
55
const mime = require("mime-types");
66
const parseurl = require("parseurl");
77
const log = require("@ui5/logger").getLogger("server:middleware:testRunner");
8+
const etag = require("etag");
9+
const fresh = require("fresh");
810

911
const testRunnerResourceRegEx = /\/test-resources\/sap\/ui\/qunit\/(testrunner\.(html|css)|TestRunner.js)$/;
1012
const resourceCache = {};
1113

12-
function serveResource(res, resourcePath, resourceContent) {
14+
function isFresh(req, res) {
15+
return fresh(req.headers, {
16+
"etag": res.getHeader("ETag")
17+
});
18+
}
19+
20+
async function readResourceInfo(resourceName) {
21+
const content = await readFile(path.join(__dirname, "testRunner", resourceName), {encoding: "utf8"});
22+
return {
23+
content,
24+
etag: etag(content)
25+
};
26+
}
27+
28+
function serveResource(req, res, resourcePath, resourceInfo) {
1329
const type = mime.lookup(resourcePath) || "application/octet-stream";
1430
const charset = mime.charset(type);
1531
const contentType = type + (charset ? "; charset=" + charset : "");
32+
res.setHeader("Content-Type", contentType);
1633

17-
// resources served by this middleware do not change often
18-
res.setHeader("Cache-Control", "public, max-age=1800");
34+
// Enable ETag caching
35+
res.setHeader("ETag", resourceInfo.etag);
1936

20-
res.setHeader("Content-Type", contentType);
21-
res.end(resourceContent);
37+
if (isFresh(req, res)) {
38+
// client has a fresh copy of the resource
39+
res.statusCode = 304;
40+
res.end();
41+
return;
42+
}
43+
44+
res.end(resourceInfo.content);
2245
}
2346

2447
/**
@@ -40,14 +63,14 @@ function createMiddleware({resources}) {
4063
log.verbose(`Serving ${pathname}`);
4164
let pResource;
4265
if (!resourceCache[pathname]) {
43-
pResource = readFile(path.join(__dirname, "testRunner", resourceName), {encoding: "utf8"});
66+
pResource = readResourceInfo(resourceName);
4467
resourceCache[pathname] = pResource;
4568
} else {
4669
pResource = resourceCache[pathname];
4770
}
4871

49-
const resourceContent = await pResource;
50-
serveResource(res, pathname, resourceContent);
72+
const resourceInfo = await pResource;
73+
serveResource(req, res, pathname, resourceInfo);
5174
} else {
5275
next();
5376
}

0 commit comments

Comments
 (0)