

























@@ -583,6 +583,70 @@ describe("readRemoteMediaBuffer", () => {
583583await expect(fs.readFile(saved.path)).resolves.toStrictEqual(Buffer.from([1, 2, 3, 4]));
584584});
585585586+it("decodes URL path basenames when deriving remote media filenames", async () => {
587+const fetchImpl = vi.fn(
588+async () =>
589+new Response(makeStream([new Uint8Array([1, 2, 3])]), {
590+status: 200,
591+headers: { "content-type": "application/pdf" },
592+}),
593+);
594+595+const saved = await saveRemoteMedia({
596+url: "https://example.com/files/My%20Report.pdf",
597+ fetchImpl,
598+lookupFn: makeLookupFn(),
599+maxBytes: 8,
600+});
601+602+expect(saved.fileName).toBe("My Report.pdf");
603+});
604+605+it("keeps raw URL path basenames when percent escapes are malformed", async () => {
606+const fetchImpl = vi.fn(
607+async () =>
608+new Response(makeStream([new Uint8Array([1, 2, 3])]), {
609+status: 200,
610+headers: { "content-type": "application/pdf" },
611+}),
612+);
613+614+const saved = await saveRemoteMedia({
615+url: "https://example.com/files/bad%E0%A4%A.pdf",
616+ fetchImpl,
617+lookupFn: makeLookupFn(),
618+maxBytes: 8,
619+});
620+621+expect(saved.fileName).toBe("bad%E0%A4%A.pdf");
622+});
623+624+it.each([
625+["https://example.com/files/reports%2FQ1.pdf", "reports_Q1.pdf"],
626+["https://example.com/files/reports%5CQ1.pdf", "reports_Q1.pdf"],
627+["https://example.com/files/reports%2F%2FQ1.pdf", "reports__Q1.pdf"],
628+])(
629+"keeps decoded URL fallback separators inside the selected basename",
630+async (url, fileName) => {
631+const fetchImpl = vi.fn(
632+async () =>
633+new Response(makeStream([new Uint8Array([1, 2, 3])]), {
634+status: 200,
635+headers: { "content-type": "application/pdf" },
636+}),
637+);
638+639+const saved = await saveRemoteMedia({
640+ url,
641+ fetchImpl,
642+lookupFn: makeLookupFn(),
643+maxBytes: 8,
644+});
645+646+expect(saved.fileName).toBe(fileName);
647+},
648+);
649+586650it("saves bodyless successful responses without unbounded buffering", async () => {
587651const saved = await saveResponseMedia(new Response(null, { status: 204 }), {
588652sourceUrl: "https://example.com/empty",
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。