Skip to content

Commit 6c13436

Browse files
committed
fix: encode URI on filename in suggestedUrl
1 parent 87ed6cc commit 6c13436

File tree

3 files changed

+13
-10
lines changed

3 files changed

+13
-10
lines changed

src/handlers/handleWrite.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import {
1717

1818
function suggestUrl(short: string, baseUrl: string, filename?: string, contentAsString?: string) {
1919
if (filename) {
20-
return `${baseUrl}/${short}/${filename}`
20+
return `${baseUrl}/${short}/${encodeURIComponent(filename)}`
2121
} else if (contentAsString && isLegalUrl(contentAsString)) {
2222
return `${baseUrl}/u/${short}`
2323
} else {

src/shared.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ export function parsePath(pathname: string): ParsedPath {
9696
// extract and remove filename
9797
const startOfFilename = pathname.lastIndexOf("/")
9898
if (startOfFilename >= 0) {
99-
filename = pathname.slice(startOfFilename + 1)
99+
filename = decodeURIComponent(pathname.slice(startOfFilename + 1))
100100
pathname = pathname.slice(0, startOfFilename)
101101
}
102102

test/controlHeaders.spec.ts

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -83,27 +83,30 @@ test("content disposition without specifying filename", async () => {
8383

8484
test("content disposition with specifying filename", async () => {
8585
const content = genRandomBlob(1024)
86-
const filename = "hello.jpg"
87-
const altFilename = "world.txt"
86+
const filename = "りんご たいへん.jpg"
87+
const filenameEncoded = encodeURIComponent(filename)
88+
const altFilename = "التفاح"
89+
const altFilenameEncoded = encodeURIComponent(altFilename)
90+
8891
const ctx = createExecutionContext()
8992

9093
const uploadResp = await upload(ctx, { c: { content, filename } })
91-
const url = uploadResp["url"]
94+
const url = uploadResp.url
9295

93-
expect(uploadResp["suggestedUrl"]).toStrictEqual(`${url}/${filename}`)
96+
expect(uploadResp.suggestedUrl).toStrictEqual(`${url}/${filenameEncoded}`)
9497

9598
expect((await workerFetch(ctx, url)).headers.get("Content-Disposition")).toStrictEqual(
96-
`inline; filename*=UTF-8''${filename}`,
99+
`inline; filename*=UTF-8''${filenameEncoded}`,
97100
)
98101
expect((await workerFetch(ctx, `${url}?a`)).headers.get("Content-Disposition")).toStrictEqual(
99-
`attachment; filename*=UTF-8''${filename}`,
102+
`attachment; filename*=UTF-8''${filenameEncoded}`,
100103
)
101104

102105
expect((await workerFetch(ctx, `${url}/${altFilename}`)).headers.get("Content-Disposition")).toStrictEqual(
103-
`inline; filename*=UTF-8''${altFilename}`,
106+
`inline; filename*=UTF-8''${altFilenameEncoded}`,
104107
)
105108
expect((await workerFetch(ctx, `${url}/${altFilename}?a`)).headers.get("Content-Disposition")).toStrictEqual(
106-
`attachment; filename*=UTF-8''${altFilename}`,
109+
`attachment; filename*=UTF-8''${altFilenameEncoded}`,
107110
)
108111
})
109112

0 commit comments

Comments
 (0)