Files
homarr/packages/common/src/url.ts
T
StrandedTurtleandMeier Lukas 7a1272146c fix(tracearr): support absolute image urls (#5654)
* Update base URL handling for tracearr integration

* fix: remove unnecessary prefix from bcrypt hashing

* refactor: add is-absolute-url check

* test: add unit tests

---------

Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2026-05-18 21:39:01 +02:00

47 lines
1.3 KiB
TypeScript

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}`);
};
const absoluteUrlRegex = /^[a-z]+:(\/\/)?/;
export const isAbsoluteUrl = (urlOrPath: string): boolean => {
return absoluteUrlRegex.test(urlOrPath.toLowerCase());
};