fix: improved compatiblity with SVR.JS Cache mod on Node.js
This commit is contained in:
parent
f573da97d3
commit
304664a9e9
1 changed files with 21 additions and 19 deletions
40
src/index.js
40
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;
|
||||
|
|
Loading…
Reference in a new issue