fix: fix empty page cache when writing the response without using piping

This commit is contained in:
Dorian Niemiec 2024-12-20 16:27:08 +01:00
parent b8d742c983
commit 633cff1235

View file

@ -69,11 +69,13 @@ module.exports = function (req, res, logFacilities, config, next) {
// Capture the response
const originalWriteHead = res.writeHead.bind(res);
const originalWrite = res.write.bind(res);
const originalEnd = res.end.bind(res);
let writtenHeaders = res.getHeaders();
let writtenStatusCode = 200;
let responseBody = "";
let maximumCachedResponseSizeExceeded = false;
let piping = false;
res.writeHead = function (statusCode, statusCodeDescription, headers) {
const properHeaders = headers ? headers : statusCodeDescription;
@ -174,7 +176,34 @@ module.exports = function (req, res, logFacilities, config, next) {
};
if (req.method != "HEAD") {
res.write = function (chunk, encoding, callback) {
if (!piping && chunk && !maximumCachedResponseSizeExceeded) {
const processedChunk = Buffer.from(
chunk,
typeof encoding === "string" ? encoding : undefined
).toString("latin1");
if (
maximumCachedResponseSize !== null &&
maximumCachedResponseSize !== undefined &&
responseBody.length + processedChunk.length >
maximumCachedResponseSize
) {
maximumCachedResponseSizeExceeded = true;
} else {
try {
responseBody += processedChunk;
// eslint-disable-next-line no-unused-vars
} catch (err) {
maximumCachedResponseSizeExceeded = true;
}
}
}
originalWrite(chunk, encoding, callback);
};
res.on("pipe", (src) => {
piping = true;
src.on("data", (chunk) => {
if (!maximumCachedResponseSizeExceeded) {
const processedChunk = Buffer.from(chunk).toString("latin1");
@ -196,6 +225,10 @@ module.exports = function (req, res, logFacilities, config, next) {
}
});
});
res.on("unpipe", () => {
piping = false;
});
}
next(); // Continue with normal processing