




























@@ -16,9 +16,11 @@ vi.mock("../infra/net/fetch-guard.js", () => ({
1616type FetchModule = typeof import("./fetch.js");
1717type ReadRemoteMediaBuffer = FetchModule["readRemoteMediaBuffer"];
1818type SaveRemoteMedia = FetchModule["saveRemoteMedia"];
19+type SaveResponseMedia = FetchModule["saveResponseMedia"];
1920type LookupFn = NonNullable<Parameters<ReadRemoteMediaBuffer>[0]["lookupFn"]>;
2021let readRemoteMediaBuffer: ReadRemoteMediaBuffer;
2122let saveRemoteMedia: SaveRemoteMedia;
23+let saveResponseMedia: SaveResponseMedia;
2224let defaultFetchMediaMaxBytes: number;
2325let tempHome: TempHomeEnv;
2426@@ -203,6 +205,7 @@ describe("readRemoteMediaBuffer", () => {
203205const fetchModule = await import("./fetch.js");
204206readRemoteMediaBuffer = fetchModule.readRemoteMediaBuffer;
205207saveRemoteMedia = fetchModule.saveRemoteMedia;
208+saveResponseMedia = fetchModule.saveResponseMedia;
206209defaultFetchMediaMaxBytes = fetchModule.DEFAULT_FETCH_MEDIA_MAX_BYTES;
207210});
208211@@ -562,6 +565,17 @@ describe("readRemoteMediaBuffer", () => {
562565await expect(fs.readFile(saved.path)).resolves.toStrictEqual(Buffer.from([1, 2, 3, 4]));
563566});
564567568+it("saves bodyless successful responses without unbounded buffering", async () => {
569+const saved = await saveResponseMedia(new Response(null, { status: 204 }), {
570+sourceUrl: "https://example.com/empty",
571+fallbackContentType: "application/octet-stream",
572+maxBytes: 8,
573+});
574+575+expect(saved.size).toBe(0);
576+await expect(fs.readFile(saved.path)).resolves.toStrictEqual(Buffer.alloc(0));
577+});
578+565579it("uses caller filename hints for MIME detection without preserving storage basenames", async () => {
566580const contentType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
567581const fetchImpl = vi.fn(
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。