Skip to content

Commit

Permalink
fix: correctly parse cookies (#24)
Browse files Browse the repository at this point in the history
  • Loading branch information
Hebilicious authored Jul 14, 2023
1 parent 0a18213 commit 0bae473
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 11 deletions.
2 changes: 2 additions & 0 deletions packages/authjs-nuxt/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,12 @@
"defu": "^6.1.2",
"immer": "^10.0.2",
"jose": "^4.14.4",
"set-cookie-parser": "^2.6.0",
"unctx": "^2.3.1"
},
"devDependencies": {
"@nuxt/module-builder": "^0.4.0",
"@types/set-cookie-parser": "^2.4.2",
"h3": "^1.7.1",
"vue": "^3.3.4"
},
Expand Down
16 changes: 13 additions & 3 deletions packages/authjs-nuxt/src/runtime/utils.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import type { AuthConfig } from "@auth/core"
import { parse } from "cookie-es"
import setCookieParser from "set-cookie-parser"
import type { H3Event, RequestHeaders } from "h3"
import { getMethod, getRequestHeaders, getRequestURL, readRawBody, sendRedirect } from "h3"
import type { RuntimeConfig } from "@nuxt/schema"
Expand Down Expand Up @@ -42,7 +43,7 @@ export function makeCookiesFromCookieString(cookieString: string | null) {

export function makeNativeHeadersFromCookieObject(headers: Record<string, string>) {
const nativeHeaders = new Headers(Object.entries(headers)
.map(([key, value]) => ["Set-Cookie", `${key}=${value}`]) as HeadersInit)
.map(([key, value]) => ["set-cookie", `${key}=${value}`]) as HeadersInit)
return nativeHeaders
}

Expand Down Expand Up @@ -82,13 +83,22 @@ export async function respondWithResponse(event: H3Event, response: Response) {
for (const [key, value] of response.headers)
event.node.res.setHeader(key, value)

const cookieHeader = response.headers.get("set-cookie")
if (cookieHeader) {
const cookieString = setCookieParser.splitCookiesString(cookieHeader)
event.node.res.setHeader("set-cookie", cookieString)
}

if (response.status === 302 && response.headers.get("Location")) {
event.node.res.statusCode = 302
return sendRedirect(event, response.headers.get("Location") as string)
}

if (response.body) {
for await (const chunk of response.body as unknown as AsyncIterable<Uint8Array>)
event.node.res.write(chunk)
const contentType = response.headers.get("Content-Type") || ""
if (contentType.includes("text") || contentType.includes("json"))
for await (const chunk of response.body as unknown as AsyncIterable<Uint8Array>) event.node.res.write(new TextDecoder().decode(chunk))
else for await (const chunk of response.body as unknown as AsyncIterable<Uint8Array>) event.node.res.write(chunk)
}
return event.node.res.end()
}
2 changes: 1 addition & 1 deletion packages/authjs-nuxt/test/auth.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ describe("all", () => {
it("can transform cookie object into headers", () => {
const cookies = { hello: "world", hi: "there" }
const headers = makeNativeHeadersFromCookieObject(cookies)
expect(headers.get("Set-Cookie")).toBe("hello=world, hi=there")
expect(headers.get("set-cookie")).toBe("hello=world, hi=there")
expect(headers instanceof Headers).toBe(true)
})

Expand Down
26 changes: 19 additions & 7 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 0bae473

Please sign in to comment.