Skip to content

Commit

Permalink
feat(core): add domain locale detection for rewrites and non default …
Browse files Browse the repository at this point in the history
…locales (#1640) (#1641)
  • Loading branch information
jose-fmeyer committed Sep 8, 2021
1 parent 1c14f38 commit cbab741
Show file tree
Hide file tree
Showing 9 changed files with 52 additions and 23 deletions.
2 changes: 1 addition & 1 deletion packages/libs/core/src/handle/default.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ export const renderRoute = async (
req.url = addDefaultLocaleToPath(
req.url,
routesManifest,
findDomainLocale(req, routesManifest)
findDomainLocale(toRequest(event), routesManifest)
);
}

Expand Down
13 changes: 10 additions & 3 deletions packages/libs/core/src/route/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,16 @@ import { normalise } from "./basepath";
import { dropLocaleFromPath } from "./locale";
import { matchDynamic } from "../match";
import { getRewritePath, isExternalRewrite } from "./rewrite";
import { ApiManifest, ApiRoute, ExternalRoute, RoutesManifest } from "../types";
import {
ApiManifest,
ApiRoute,
ExternalRoute,
RoutesManifest,
Request
} from "../types";

export const handleApiReq = (
req: Request,
uri: string,
manifest: ApiManifest,
routesManifest: RoutesManifest,
Expand All @@ -21,7 +28,7 @@ export const handleApiReq = (
};
}

const rewrite = !isRewrite && getRewritePath(uri, routesManifest);
const rewrite = !isRewrite && getRewritePath(req, uri, routesManifest);
if (rewrite) {
// Rewrites include locales even for api routes
const apiRewrite = dropLocaleFromPath(rewrite, routesManifest);
Expand All @@ -33,7 +40,7 @@ export const handleApiReq = (
querystring
};
}
const route = handleApiReq(path, manifest, routesManifest, true);
const route = handleApiReq(req, path, manifest, routesManifest, true);
if (route) {
return {
...route,
Expand Down
4 changes: 2 additions & 2 deletions packages/libs/core/src/route/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ export const routeApi = (
return redirect;
}

return handleApiReq(req.uri, manifest, routesManifest);
return handleApiReq(req, req.uri, manifest, routesManifest);
};

/*
Expand Down Expand Up @@ -181,6 +181,6 @@ export const routeDefault = async (
if (isDataReq) {
return handleDataReq(uri, manifest, routesManifest, isPreview);
} else {
return handlePageReq(req.uri, manifest, routesManifest, isPreview);
return handlePageReq(req, req.uri, manifest, routesManifest, isPreview);
}
};
7 changes: 3 additions & 4 deletions packages/libs/core/src/route/locale.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,15 @@
import { Manifest, Request, RoutesManifest } from "../types";
import { IncomingMessage } from "http";
import { parse } from "cookie";

export const findDomainLocale = (
req: IncomingMessage,
req: Request,
manifest: RoutesManifest
): string | null => {
const domains = manifest.i18n?.domains;
if (domains) {
const hostHeaders = req.headers.host?.split(",");
const hostHeaders = req.headers.host;
if (hostHeaders && hostHeaders.length > 0) {
const host = hostHeaders[0];
const host = hostHeaders[0].value.split(":")[0];
const matchedDomain = domains.find((d) => d.domain === host);

if (matchedDomain) {
Expand Down
20 changes: 16 additions & 4 deletions packages/libs/core/src/route/page.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,18 @@
import { normalise } from "./basepath";
import { addDefaultLocaleToPath, dropLocaleFromPath } from "./locale";
import {
addDefaultLocaleToPath,
dropLocaleFromPath,
findDomainLocale
} from "./locale";
import { matchDynamicRoute } from "../match";
import { notFoundPage } from "./notfound";
import { getRewritePath, isExternalRewrite } from "./rewrite";
import {
ExternalRoute,
PageManifest,
PageRoute,
RoutesManifest
RoutesManifest,
Request
} from "../types";

const pageHtml = (localeUri: string) => {
Expand All @@ -18,6 +23,7 @@ const pageHtml = (localeUri: string) => {
};

export const handlePageReq = (
req: Request,
uri: string,
manifest: PageManifest,
routesManifest: RoutesManifest,
Expand All @@ -26,7 +32,11 @@ export const handlePageReq = (
): ExternalRoute | PageRoute => {
const { pages } = manifest;
const localeUri = normalise(
addDefaultLocaleToPath(uri, routesManifest),
addDefaultLocaleToPath(
uri,
routesManifest,
findDomainLocale(req, routesManifest)
),
routesManifest
);
if (pages.html.nonDynamic[localeUri]) {
Expand Down Expand Up @@ -67,7 +77,8 @@ export const handlePageReq = (
};
}

const rewrite = !isRewrite && getRewritePath(uri, routesManifest, manifest);
const rewrite =
!isRewrite && getRewritePath(req, uri, routesManifest, manifest);
if (rewrite) {
const [path, querystring] = rewrite.split("?");
if (isExternalRewrite(path)) {
Expand All @@ -78,6 +89,7 @@ export const handlePageReq = (
};
}
const route = handlePageReq(
req,
path,
manifest,
routesManifest,
Expand Down
13 changes: 9 additions & 4 deletions packages/libs/core/src/route/rewrite.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { addDefaultLocaleToPath } from "./locale";
import { addDefaultLocaleToPath, findDomainLocale } from "./locale";
import { compileDestination, matchPath } from "../match";
import { PageManifest, RewriteData, RoutesManifest } from "../types";
import { PageManifest, Request, RewriteData, RoutesManifest } from "../types";
import { handlePageReq } from "../route/page";

/**
Expand All @@ -10,12 +10,16 @@ import { handlePageReq } from "../route/page";
* @param routesManifest
*/
export function getRewritePath(
req: Request,
uri: string,
routesManifest: RoutesManifest,
pageManifest?: PageManifest
): string | undefined {
const path = addDefaultLocaleToPath(uri, routesManifest);

const path = addDefaultLocaleToPath(
uri,
routesManifest,
findDomainLocale(req, routesManifest)
);
const rewrites: RewriteData[] = routesManifest.rewrites;

for (const rewrite of rewrites) {
Expand All @@ -33,6 +37,7 @@ export function getRewritePath(
// No-op rewrite support for pages: skip to next rewrite if path does not map to existing non-dynamic and dynamic routes
if (pageManifest && path === destination) {
const url = handlePageReq(
req,
destination,
pageManifest,
routesManifest,
Expand Down
1 change: 0 additions & 1 deletion packages/libs/core/tests/handle/default.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -420,7 +420,6 @@ describe("Default handler", () => {
routesManifest,
getPage
);

expect(route).toBeTruthy();
if (route) {
expect(route.isExternal).toBeTruthy();
Expand Down
7 changes: 4 additions & 3 deletions packages/libs/core/tests/route/locale.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -82,9 +82,10 @@ describe("Locale Utils Tests", () => {
`("$host is resolved to $expectedResult", ({ host, expectedResult }) => {
const req = {
headers: {
host
}
} as unknown as IncomingMessage;
host: [{ key: "Host", value: host }]
},
uri: "/test"
};
const newPath = findDomainLocale(req, routesManifest);

expect(newPath).toBe(expectedResult);
Expand Down
8 changes: 7 additions & 1 deletion packages/libs/core/tests/route/rewrite.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,13 @@ describe("Rewriter Tests", () => {
`(
"rewrites path $path to $expectedRewrite",
({ path, expectedRewrite }) => {
const rewrite = getRewritePath(path, routesManifest, pageManifest);
const req = {
headers: {
host: [{ key: "Host", value: "next-serverless.com" }]
},
uri: path
};
const rewrite = getRewritePath(req, path, routesManifest, pageManifest);

if (expectedRewrite) {
expect(rewrite).toEqual(expectedRewrite);
Expand Down

0 comments on commit cbab741

Please sign in to comment.