From b65171e37df066cf7c509434c611163fc8a3c720 Mon Sep 17 00:00:00 2001 From: uki00a Date: Mon, 26 Oct 2020 22:55:26 +0900 Subject: [PATCH] fix(std/http/file_server): File server should ignore query params (#8116) --- std/http/file_server.ts | 24 ++++++++++++++++-------- std/http/file_server_test.ts | 15 +++++++++++++++ 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/std/http/file_server.ts b/std/http/file_server.ts index d8751eb84d..e4c8c49313 100644 --- a/std/http/file_server.ts +++ b/std/http/file_server.ts @@ -321,6 +321,21 @@ function html(strings: TemplateStringsArray, ...values: unknown[]): string { return html; } +function normalizeURL(url: string): string { + let normalizedUrl = posix.normalize(url); + try { + normalizedUrl = decodeURIComponent(normalizedUrl); + } catch (e) { + if (!(e instanceof URIError)) { + throw e; + } + } + const startOfParams = normalizedUrl.indexOf("?"); + return startOfParams > -1 + ? normalizedUrl.slice(0, startOfParams) + : normalizedUrl; +} + function main(): void { const CORSEnabled = serverArgs.cors ? true : false; const port = serverArgs.port ?? serverArgs.p ?? 4507; @@ -362,14 +377,7 @@ function main(): void { } const handler = async (req: ServerRequest): Promise => { - let normalizedUrl = posix.normalize(req.url); - try { - normalizedUrl = decodeURIComponent(normalizedUrl); - } catch (e) { - if (!(e instanceof URIError)) { - throw e; - } - } + const normalizedUrl = normalizeURL(req.url); const fsPath = posix.join(target, normalizedUrl); let response: Response | undefined; diff --git a/std/http/file_server_test.ts b/std/http/file_server_test.ts index d8df631b80..3368b2e15d 100644 --- a/std/http/file_server_test.ts +++ b/std/http/file_server_test.ts @@ -206,6 +206,21 @@ Deno.test("file_server running as library", async function (): Promise { } }); +Deno.test("file_server should ignore query params", async () => { + await startFileServer(); + try { + const res = await fetch("http://localhost:4507/README.md?key=value"); + assertEquals(res.status, 200); + const downloadedFile = await res.text(); + const localFile = new TextDecoder().decode( + await Deno.readFile(join(moduleDir, "README.md")), + ); + assertEquals(downloadedFile, localFile); + } finally { + await killFileServer(); + } +}); + async function startTlsFileServer({ target = ".", port = 4577,