metatron-open-seo/src/server/mcp/public-origin.ts

44 lines
1.1 KiB
TypeScript

function firstHeaderValue(value: string | null) {
return value?.split(",")[0]?.trim() || null;
}
function getForwardedProtocol(request: Request) {
const protocol = firstHeaderValue(request.headers.get("x-forwarded-proto"));
return protocol === "http" || protocol === "https" ? protocol : null;
}
export function getPublicOrigin(request: Request) {
const url = new URL(request.url);
if (url.protocol === "https:") {
return url.origin;
}
const protocol = getForwardedProtocol(request);
const host = firstHeaderValue(request.headers.get("x-forwarded-host"));
if (!protocol || !host) {
return url.origin;
}
try {
return new URL(`${protocol}://${host}`).origin;
} catch {
return url.origin;
}
}
export function requestWithPublicOrigin(request: Request) {
const url = new URL(request.url);
const publicOrigin = getPublicOrigin(request);
if (url.origin === publicOrigin) {
return request;
}
const publicUrl = new URL(
`${url.pathname}${url.search}${url.hash}`,
publicOrigin,
);
return new Request(publicUrl, request);
}