From 304664a9e9f14a610456302a31fc29a71b7f1554 Mon Sep 17 00:00:00 2001 From: Dorian Niemiec Date: Sun, 19 Jan 2025 11:31:45 +0100 Subject: [PATCH] fix: improved compatiblity with SVR.JS Cache mod on Node.js --- src/index.js | 40 +++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/src/index.js b/src/index.js index 9b21752..d86c8da 100644 --- a/src/index.js +++ b/src/index.js @@ -51,7 +51,8 @@ module.exports = (req, res, logFacilities, config, next) => { const originalWriteHead = res.writeHead.bind(res); const originalWrite = res.write.bind(res); const originalEnd = res.end.bind(res); - let writtenHeaders = res.getHeaders(); + let checkedHeaders = res.getHeaders(); + let writtenHeaders = {}; let writtenStatusCode = 200; let writtenStatusCodeDescription = null; let headersSet = false; @@ -60,36 +61,37 @@ module.exports = (req, res, logFacilities, config, next) => { const responseWriteCallbacks = []; res.setHeader = function (name, value) { - writtenHeaders[name.toLowerCase()] = value; + checkedHeaders[name.toLowerCase()] = value; return originalSetHeader(name, value); }; res.removeHeader = function (name) { - delete writtenHeaders[name.toLowerCase()]; + delete checkedHeaders[name.toLowerCase()]; return originalRemoveHeader(name); }; res.writeHead = function (statusCode, statusCodeDescription, headers) { const properHeaders = headers ? headers : statusCodeDescription; if (typeof properHeaders === "object" && properHeaders !== null) { + writtenHeaders = properHeaders; Object.keys(properHeaders).forEach((key) => { - writtenHeaders[key.toLowerCase()] = properHeaders[key]; + checkedHeaders[key.toLowerCase()] = properHeaders[key]; }); } writtenStatusCode = statusCode; let intervene = false; - Object.keys(writtenHeaders).every((key) => { - if (typeof writtenHeaders[key] == "string") { + Object.keys(checkedHeaders).every((key) => { + if (typeof checkedHeaders[key] == "string") { securityResponse = transaction.addResponseHeader( key, - writtenHeaders[key] + checkedHeaders[key] ); if (typeof securityResponse === "object") { intervene = true; return false; } - } else if (Array.isArray(writtenHeaders[key])) { - writtenHeaders[key].every((value) => { + } else if (Array.isArray(checkedHeaders[key])) { + checkedHeaders[key].every((value) => { securityResponse = transaction.addResponseHeader(key, value); if (typeof securityResponse === "object") { intervene = true; @@ -145,18 +147,18 @@ module.exports = (req, res, logFacilities, config, next) => { res.end = function (chunk, encoding, callback) { if (!headersSet) { let intervene = false; - Object.keys(writtenHeaders).forEach((key) => { - if (typeof writtenHeaders[key] == "string") { + Object.keys(checkedHeaders).forEach((key) => { + if (typeof checkedHeaders[key] == "string") { securityResponse = transaction.addResponseHeader( key, - writtenHeaders[key] + checkedHeaders[key] ); if (typeof securityResponse === "object") { intervene = true; return; } - } else if (Array.isArray(writtenHeaders[key])) { - writtenHeaders[key].forEach((value) => { + } else if (Array.isArray(checkedHeaders[key])) { + checkedHeaders[key].forEach((value) => { securityResponse = transaction.addResponseHeader(key, value); if (typeof securityResponse === "object") { intervene = true; @@ -269,18 +271,18 @@ module.exports = (req, res, logFacilities, config, next) => { res.write = function (chunk, encoding, callback) { if (!headersSet) { let intervene = false; - Object.keys(writtenHeaders).every((key) => { - if (typeof writtenHeaders[key] == "string") { + Object.keys(checkedHeaders).every((key) => { + if (typeof checkedHeaders[key] == "string") { securityResponse = transaction.addResponseHeader( key, - writtenHeaders[key] + checkedHeaders[key] ); if (typeof securityResponse === "object") { intervene = true; return false; } - } else if (Array.isArray(writtenHeaders[key])) { - writtenHeaders[key].every((value) => { + } else if (Array.isArray(checkedHeaders[key])) { + checkedHeaders[key].every((value) => { securityResponse = transaction.addResponseHeader(key, value); if (typeof securityResponse === "object") { intervene = true;