From 5e0fb0e4af94ce7fe50e3c6e12ff3ef54288cdd2 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 11 Dec 2024 23:11:19 +0200 Subject: [PATCH] fix(utils): allow for Unicode characters in Content-Disposition --- spec/utils.spec.ts | 10 ++++++++-- src/utils.ts | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/spec/utils.spec.ts b/spec/utils.spec.ts index 055115bc7..c289e199f 100644 --- a/spec/utils.spec.ts +++ b/spec/utils.spec.ts @@ -89,9 +89,15 @@ describe("utils tests", () => { describe("setContentDispositionHeader tests", () => { it("sets Content-Disposition header with specified value", () => { const fileName = "file.txt"; - const value = `attachment; filename="${fileName}"`; + const value = `attachment; filename*=utf-8''${fileName}`; setContentDispositionHeader(fileName, res); - expect((res.setHeader as SinonStub).calledOnceWith("Content-Disposition", value)); + expect((res.setHeader as SinonStub).calledOnceWith("Content-Disposition", value)).to.be.true; + }); + it("sets Content-Disposition header with specified unicode", () => { + const fileName = "file.txt"; + const value = `attachment; filename*=utf-8''${encodeURIComponent(fileName)}`; + setContentDispositionHeader(fileName, res); + expect((res.setHeader as SinonStub).calledOnceWith("Content-Disposition", value)).to.be.true; }); }); describe("setCacheControlHeaderNoCache tests", () => { diff --git a/src/utils.ts b/src/utils.ts index 80436e97b..2a5a438d5 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -9,5 +9,5 @@ export const setAcceptRangesHeader = setHeader.bind(null, "Accept-Ranges", "byte export const setContentRangeHeader = (range: Range | null, size: number, res: Response) => setHeader("Content-Range", `bytes ${range ? `${range.start}-${range.end}` : "*"}/${size}`, res); export const setContentDispositionHeader = (fileName: string, res: Response) => - setHeader("Content-Disposition", `attachment; filename="${fileName}"`, res); + setHeader("Content-Disposition", `attachment; filename*=utf-8''${encodeURIComponent(fileName)}`, res); export const setCacheControlHeaderNoCache = setHeader.bind(null, "Cache-Control", "no-cache");