fix: improved compatiblity with SVR.JS Cache mod on Node.js

This commit is contained in:
Dorian Niemiec 2025-01-19 11:31:45 +01:00
parent f573da97d3
commit 304664a9e9

View file

@ -51,7 +51,8 @@ module.exports = (req, res, logFacilities, config, next) => {
const originalWriteHead = res.writeHead.bind(res); const originalWriteHead = res.writeHead.bind(res);
const originalWrite = res.write.bind(res); const originalWrite = res.write.bind(res);
const originalEnd = res.end.bind(res); const originalEnd = res.end.bind(res);
let writtenHeaders = res.getHeaders(); let checkedHeaders = res.getHeaders();
let writtenHeaders = {};
let writtenStatusCode = 200; let writtenStatusCode = 200;
let writtenStatusCodeDescription = null; let writtenStatusCodeDescription = null;
let headersSet = false; let headersSet = false;
@ -60,36 +61,37 @@ module.exports = (req, res, logFacilities, config, next) => {
const responseWriteCallbacks = []; const responseWriteCallbacks = [];
res.setHeader = function (name, value) { res.setHeader = function (name, value) {
writtenHeaders[name.toLowerCase()] = value; checkedHeaders[name.toLowerCase()] = value;
return originalSetHeader(name, value); return originalSetHeader(name, value);
}; };
res.removeHeader = function (name) { res.removeHeader = function (name) {
delete writtenHeaders[name.toLowerCase()]; delete checkedHeaders[name.toLowerCase()];
return originalRemoveHeader(name); return originalRemoveHeader(name);
}; };
res.writeHead = function (statusCode, statusCodeDescription, headers) { res.writeHead = function (statusCode, statusCodeDescription, headers) {
const properHeaders = headers ? headers : statusCodeDescription; const properHeaders = headers ? headers : statusCodeDescription;
if (typeof properHeaders === "object" && properHeaders !== null) { if (typeof properHeaders === "object" && properHeaders !== null) {
writtenHeaders = properHeaders;
Object.keys(properHeaders).forEach((key) => { Object.keys(properHeaders).forEach((key) => {
writtenHeaders[key.toLowerCase()] = properHeaders[key]; checkedHeaders[key.toLowerCase()] = properHeaders[key];
}); });
} }
writtenStatusCode = statusCode; writtenStatusCode = statusCode;
let intervene = false; let intervene = false;
Object.keys(writtenHeaders).every((key) => { Object.keys(checkedHeaders).every((key) => {
if (typeof writtenHeaders[key] == "string") { if (typeof checkedHeaders[key] == "string") {
securityResponse = transaction.addResponseHeader( securityResponse = transaction.addResponseHeader(
key, key,
writtenHeaders[key] checkedHeaders[key]
); );
if (typeof securityResponse === "object") { if (typeof securityResponse === "object") {
intervene = true; intervene = true;
return false; return false;
} }
} else if (Array.isArray(writtenHeaders[key])) { } else if (Array.isArray(checkedHeaders[key])) {
writtenHeaders[key].every((value) => { checkedHeaders[key].every((value) => {
securityResponse = transaction.addResponseHeader(key, value); securityResponse = transaction.addResponseHeader(key, value);
if (typeof securityResponse === "object") { if (typeof securityResponse === "object") {
intervene = true; intervene = true;
@ -145,18 +147,18 @@ module.exports = (req, res, logFacilities, config, next) => {
res.end = function (chunk, encoding, callback) { res.end = function (chunk, encoding, callback) {
if (!headersSet) { if (!headersSet) {
let intervene = false; let intervene = false;
Object.keys(writtenHeaders).forEach((key) => { Object.keys(checkedHeaders).forEach((key) => {
if (typeof writtenHeaders[key] == "string") { if (typeof checkedHeaders[key] == "string") {
securityResponse = transaction.addResponseHeader( securityResponse = transaction.addResponseHeader(
key, key,
writtenHeaders[key] checkedHeaders[key]
); );
if (typeof securityResponse === "object") { if (typeof securityResponse === "object") {
intervene = true; intervene = true;
return; return;
} }
} else if (Array.isArray(writtenHeaders[key])) { } else if (Array.isArray(checkedHeaders[key])) {
writtenHeaders[key].forEach((value) => { checkedHeaders[key].forEach((value) => {
securityResponse = transaction.addResponseHeader(key, value); securityResponse = transaction.addResponseHeader(key, value);
if (typeof securityResponse === "object") { if (typeof securityResponse === "object") {
intervene = true; intervene = true;
@ -269,18 +271,18 @@ module.exports = (req, res, logFacilities, config, next) => {
res.write = function (chunk, encoding, callback) { res.write = function (chunk, encoding, callback) {
if (!headersSet) { if (!headersSet) {
let intervene = false; let intervene = false;
Object.keys(writtenHeaders).every((key) => { Object.keys(checkedHeaders).every((key) => {
if (typeof writtenHeaders[key] == "string") { if (typeof checkedHeaders[key] == "string") {
securityResponse = transaction.addResponseHeader( securityResponse = transaction.addResponseHeader(
key, key,
writtenHeaders[key] checkedHeaders[key]
); );
if (typeof securityResponse === "object") { if (typeof securityResponse === "object") {
intervene = true; intervene = true;
return false; return false;
} }
} else if (Array.isArray(writtenHeaders[key])) { } else if (Array.isArray(checkedHeaders[key])) {
writtenHeaders[key].every((value) => { checkedHeaders[key].every((value) => {
securityResponse = transaction.addResponseHeader(key, value); securityResponse = transaction.addResponseHeader(key, value);
if (typeof securityResponse === "object") { if (typeof securityResponse === "object") {
intervene = true; intervene = true;