fix: omit source content length for rewritten file responses

This commit is contained in:
tdurieux
2026-09-06 09:16:23 +02:00
parent 12c07641e0
commit 900516f225
2 changed files with 44 additions and 4 deletions
+44
View File
@@ -0,0 +1,44 @@
const { setTimeout, setImmediate } = require("timers");
const { expect } = require("chai");
require("ts-node/register/transpile-only");
const { Readable } = require("stream");
const { once } = require("events");
const config = require("../src/config").default;
const db = require("../src/server/database");
const gh = require("../src/core/GitHubUtils");
const RepoModel = require("../src/core/model/anonymizedRepositories/anonymizedRepositories.model").default;
const Repository = require("../src/core/Repository").default;
const GitHubStream = require("../src/core/source/GitHubStream").default;
const { ContentAnonimizer, AnonymizeTransformer, anonymizePath } = require("../src/core/anonymize-utils");
async function collect(stream) {
const chunks = [];
for await (const chunk of stream) chunks.push(Buffer.from(chunk));
return Buffer.concat(chunks).toString();
}
describe("production regressions", function () {
const restores = [];
function stub(object, key, value) {
const old = object[key]; restores.push(() => { object[key] = old; }); object[key] = value;
}
afterEach(() => { while (restores.length) restores.pop()(); });
it("omits an upstream length when later text is rewritten", async function () {
const File = require("../src/core/AnonymizedFile").default;
stub(config, "STREAMER_ENTRYPOINT", "");
const repo = new Repository(new RepoModel({ repoId: "repo", options: { terms: ["Alice"], image: true, link: true }, source: {} }));
const file = new File({ repository: repo, anonymizedPath: "file.txt" });
const input = "z".repeat(9000) + " Alice";
file._file = { name: "file.txt", path: "", size: input.length };
file.content = async () => Readable.from([Buffer.from(input.slice(0, 5000)), Buffer.from(input.slice(5000))]);
const res = new (require("stream").PassThrough)();
const headers = {};
res.header = (key, value) => { headers[key] = value; return res; };
res.contentType = () => res;
const output = collect(res);
await file.send(res);
expect(await output).to.equal("z".repeat(9000) + " XXXX-1");
expect(headers).not.to.have.property("Content-Length");
});
});