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 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;