60 lines · 2.0 KB · TypeScript
RawDownload
import { describe, expect, it } from "@effect/vitest"; import { browserOriginFromRequest } from "./request-origin"; const req = (url: string, headers: Record<string, string> = {}): Request =>  new Request(url, { headers }); describe("browserOriginFromRequest", () => {  it("uses the request URL origin when no proxy headers are present (Cloudflare)", () => {    expect(browserOriginFromRequest(req("https://executor.sh/acme/policies"))).toBe(      "https://executor.sh",    );  });   it("honors X-Forwarded-Proto to recover https behind a TLS-terminating proxy", () => {    // tailscale serve / nginx: browser on https, upstream request is http.    expect(      browserOriginFromRequest(        req("http://mac-mini.tail5665af.ts.net:47130/acme/policies", {          "x-forwarded-proto": "https",        }),      ),    ).toBe("https://mac-mini.tail5665af.ts.net:47130");  });   it("honors X-Forwarded-Host when the proxy rewrites the host", () => {    expect(      browserOriginFromRequest(        req("http://127.0.0.1:8080/", {          "x-forwarded-proto": "https",          "x-forwarded-host": "executor.sh",        }),      ),    ).toBe("https://executor.sh");  });   it("takes the first value of a comma-listed forwarded chain", () => {    expect(      browserOriginFromRequest(        req("http://internal:8080/", {          "x-forwarded-proto": "https, http",          "x-forwarded-host": "executor.sh, internal",        }),      ),    ).toBe("https://executor.sh");  });   it("falls back to the request scheme/host for the half-set header", () => {    // Only proto forwarded: keep the request's own host.    expect(      browserOriginFromRequest(req("http://localhost:43130/", { "x-forwarded-proto": "https" })),    ).toBe("https://localhost:43130");    // Only host forwarded: keep the request's own scheme.    expect(      browserOriginFromRequest(        req("http://localhost:43130/", { "x-forwarded-host": "executor.sh" }),      ),    ).toBe("http://executor.sh");  });});