UNPKG

astro

Version:

Astro is a modern site builder with web best practices, performance, and DX front-of-mind.

66 lines (65 loc) 2.42 kB
import { appendForwardSlash, collapseDuplicateLeadingSlashes, joinPaths, prependForwardSlash, removeTrailingForwardSlash } from "@astrojs/internal-helpers/path"; import { normalizeTheLocale } from "../../i18n/path.js"; function computePathnameFromDomain(request, url, i18n, base, trailingSlash, logger, pathnameFromRequest) { let pathname = void 0; if (i18n && (i18n.strategy === "domains-prefix-always" || i18n.strategy === "domains-prefix-other-locales" || i18n.strategy === "domains-prefix-always-no-redirect")) { let host = request.headers.get("X-Forwarded-Host"); let protocol = request.headers.get("X-Forwarded-Proto"); if (protocol) { protocol = protocol + ":"; } else { protocol = url.protocol; } if (!host) { host = request.headers.get("Host"); } if (host && protocol) { host = host.split(":")[0]; try { let locale; const hostAsUrl = new URL(`${protocol}//${host}`); for (const [domainKey, localeValue] of Object.entries(i18n.domainLookupTable)) { const domainKeyAsUrl = new URL(domainKey); if (hostAsUrl.host === domainKeyAsUrl.host && hostAsUrl.protocol === domainKeyAsUrl.protocol) { locale = localeValue; break; } } if (locale) { const requestPathname = pathnameFromRequest ?? removeBase(url.pathname, base); pathname = prependForwardSlash(joinPaths(normalizeTheLocale(locale), requestPathname)); if (trailingSlash === "always") { pathname = appendForwardSlash(pathname); } else if (trailingSlash === "never") { pathname = removeTrailingForwardSlash(pathname); } else if (requestPathname.endsWith("/")) { pathname = appendForwardSlash(pathname); } } } catch (e) { logger.error( "router", `Astro tried to parse ${protocol}//${host} as an URL, but it threw a parsing error. Check the X-Forwarded-Host and X-Forwarded-Proto headers.` ); logger.error("router", `Error: ${e}`); } } } return pathname; } function removeBase(pathname, base) { pathname = collapseDuplicateLeadingSlashes(pathname); if (pathname.startsWith(base)) { return pathname.slice(removeTrailingForwardSlash(base).length + 1); } return pathname; } export { computePathnameFromDomain };