44 lines
1.1 KiB
TypeScript
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);
|
|
}
|