Skip to content

Commit 668ce91

Browse files
add cors
1 parent f929530 commit 668ce91

File tree

1 file changed

+55
-1
lines changed

1 file changed

+55
-1
lines changed

packages/website-v2/src/routes/[_]rpc.ts

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,18 @@ const RPC_BASE_URL = "https://rpc.inlang.com";
1818
const RPC_PATH = "/_rpc";
1919

2020
async function proxyRpcRequest(request: Request) {
21+
const corsHeaders = buildCorsHeaders(request);
22+
if (corsHeaders === null) {
23+
return new Response("CORS origin denied", { status: 403 });
24+
}
25+
26+
if (request.method === "OPTIONS") {
27+
return new Response(null, {
28+
status: 204,
29+
headers: corsHeaders,
30+
});
31+
}
32+
2133
const upstreamUrl = `${RPC_BASE_URL}${RPC_PATH}`;
2234
const headers = new Headers(request.headers);
2335

@@ -34,9 +46,51 @@ async function proxyRpcRequest(request: Request) {
3446
redirect: "manual",
3547
});
3648

49+
const responseHeaders = new Headers(response.headers);
50+
for (const [key, value] of corsHeaders.entries()) {
51+
responseHeaders.set(key, value);
52+
}
53+
3754
return new Response(response.body, {
3855
status: response.status,
3956
statusText: response.statusText,
40-
headers: response.headers,
57+
headers: responseHeaders,
4158
});
4259
}
60+
61+
function buildCorsHeaders(request: Request) {
62+
const headers = new Headers();
63+
const origin = request.headers.get("origin");
64+
if (!origin) {
65+
return null;
66+
}
67+
68+
if (!isAllowedOrigin(origin)) {
69+
return null;
70+
}
71+
72+
headers.set("access-control-allow-origin", origin);
73+
headers.set("access-control-allow-credentials", "true");
74+
headers.set("access-control-allow-methods", "POST,OPTIONS");
75+
headers.set(
76+
"access-control-allow-headers",
77+
request.headers.get("access-control-request-headers") ?? "content-type"
78+
);
79+
headers.set("vary", "origin");
80+
return headers;
81+
}
82+
83+
function isAllowedOrigin(origin: string) {
84+
let hostname = "";
85+
try {
86+
hostname = new URL(origin).hostname;
87+
} catch {
88+
return false;
89+
}
90+
91+
if (hostname === "localhost") {
92+
return true;
93+
}
94+
95+
return hostname === "inlang.com" || hostname.endsWith(".inlang.com");
96+
}

0 commit comments

Comments
 (0)