import type { ReadonlyHeaders } from "next/dist/server/web/spec-extension/adapters/headers"; export const removeTrailingSlash = (path: string) => { return path.at(-1) === "/" ? path.substring(0, path.length - 1) : path; }; export const extractBaseUrlFromHeaders = ( headers: ReadonlyHeaders, fallbackProtocol: "http" | "https" = "http", ): `${string}://${string}` => { // For empty string we also use the fallback protocol // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing let protocol = headers.get("x-forwarded-proto") || fallbackProtocol; // @see https://support.glitch.com/t/x-forwarded-proto-contains-multiple-protocols/17219 if (protocol.includes(",")) { protocol = protocol.includes("https") ? "https" : "http"; } const host = headers.get("x-forwarded-host") ?? headers.get("host"); return `${protocol}://${host}`; }; export const getPortFromUrl = (url: URL): number => { const port = url.port; if (port) { return Number(port); } if (url.protocol === "https:") { return 443; } if (url.protocol === "http:") { return 80; } throw new Error(`Unsupported protocol: ${url.protocol}`); };