Skip to content
This repository was archived by the owner on Jan 28, 2025. It is now read-only.

Commit d894188

Browse files
committed
handle cookie
1 parent 06187d6 commit d894188

File tree

2 files changed

+30
-14
lines changed

2 files changed

+30
-14
lines changed

packages/libs/core/src/route/locale.ts

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { Manifest, Request, RoutesManifest } from "../types";
22
import { IncomingMessage } from "http";
3+
import { parse } from "cookie";
34

45
export const findDomainLocale = (
56
req: IncomingMessage,
@@ -143,12 +144,25 @@ export async function getLocaleDomainRedirect(
143144
const languageHeader = req.headers["accept-language"];
144145
const acceptLanguage = languageHeader && languageHeader[0]?.value;
145146

146-
// Try to find the right domain to redirect to if needed
147-
const Accept = await import("@hapi/accept");
148-
const acceptLanguages = Accept.languages(acceptLanguage).map((lang) =>
149-
lang.toLowerCase()
150-
);
147+
const headerCookies = req.headers.cookie
148+
? req.headers.cookie[0]?.value
149+
: undefined;
150+
// Use cookies first, otherwise use the accept-language header
151+
let acceptLanguages: string[] = [];
152+
if (headerCookies) {
153+
const cookies = parse(headerCookies);
154+
const nextLocale = cookies["NEXT_LOCALE"];
155+
if (nextLocale) {
156+
acceptLanguages = [nextLocale.toLowerCase()];
157+
}
158+
} else {
159+
const Accept = await import("@hapi/accept");
160+
acceptLanguages = Accept.languages(acceptLanguage).map((lang) =>
161+
lang.toLowerCase()
162+
);
163+
}
151164

165+
// Try to find the right domain to redirect to if needed
152166
// First check current domain can support any preferred language, if so do not redirect
153167
const currentDomainData = domains.find(
154168
(domainData) => domainData.domain === host

packages/libs/core/tests/route/locale.test.ts

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -120,19 +120,21 @@ describe("Locale Utils Tests", () => {
120120
});
121121

122122
it.each`
123-
host | acceptLang | expectedRedirect
124-
${"next-serverless.com"} | ${"en"} | ${undefined}
125-
${"next-serverless.com"} | ${"fr"} | ${"next-serverless.fr/test"}
126-
${"next-serverless.com"} | ${"fr;q=0.7, nl;q=0.9"} | ${"next-serverless.nl/test"}
127-
${"next-serverless.fr"} | ${"es"} | ${"next-serverless.com/test"}
128-
${"next-serverless.fr"} | ${"en-GB"} | ${"next-serverless.com/test"}
123+
host | acceptLang | cookie | expectedRedirect
124+
${"next-serverless.com"} | ${"en"} | ${undefined} | ${undefined}
125+
${"next-serverless.com"} | ${"fr"} | ${undefined} | ${"next-serverless.fr/test"}
126+
${"next-serverless.com"} | ${"fr;q=0.7, nl;q=0.9"} | ${undefined} | ${"next-serverless.nl/test"}
127+
${"next-serverless.fr"} | ${"es"} | ${undefined} | ${"next-serverless.com/test"}
128+
${"next-serverless.fr"} | ${"en-GB"} | ${undefined} | ${"next-serverless.com/test"}
129+
${"next-serverless.com"} | ${"en"} | ${"NEXT_LOCALE=fr"} | ${"next-serverless.fr/test"}
129130
`(
130-
"host: $host with accept-language: $acceptLang redirects to $expectedRedirect",
131-
async ({ host, acceptLang, expectedRedirect }) => {
131+
"host: $host with accept-language: $acceptLang and cookie: $cookie redirects to $expectedRedirect",
132+
async ({ host, acceptLang, cookie, expectedRedirect }) => {
132133
const req = {
133134
headers: {
134135
host: [{ key: "Host", value: host }],
135-
"accept-language": [{ key: "Accept-Language", value: acceptLang }]
136+
"accept-language": [{ key: "Accept-Language", value: acceptLang }],
137+
cookie: [{ key: "Cookie", value: cookie }]
136138
},
137139
uri: "/test"
138140
};

0 commit comments

Comments
 (0)