diff --git a/src/utils/body.ts b/src/utils/body.ts index 220bc0fc..34b0b8eb 100644 --- a/src/utils/body.ts +++ b/src/utils/body.ts @@ -64,7 +64,18 @@ export async function readBody (event: H3Event): Promise { const body = await readRawBody(event) as string; if (event.node.req.headers["content-type"] === "application/x-www-form-urlencoded") { - const parsedForm = Object.fromEntries(new URLSearchParams(body)); + const form = new URLSearchParams(body); + const parsedForm: Record = Object.create(null); + for (const [key, value] of form.entries()) { + if (key in parsedForm) { + if (!Array.isArray(parsedForm[key])) { + parsedForm[key] = [parsedForm[key]]; + } + parsedForm[key].push(value); + } else { + parsedForm[key] = value; + } + } return parsedForm as unknown as T; } diff --git a/test/body.test.ts b/test/body.test.ts index 6cda4c8a..dc0ab83a 100644 --- a/test/body.test.ts +++ b/test/body.test.ts @@ -118,12 +118,12 @@ describe("", () => { expect(body).toMatchObject({ field: "value", another: "true", - number: "20" + number: ["20", "30", "40"] }); return "200"; })); const result = await request.post("/api/test") - .send("field=value&another=true&number=20"); + .send("field=value&another=true&number=20&number=30&number=40"); expect(result.text).toBe("200"); });