@@ -18,6 +18,18 @@ const RPC_BASE_URL = "https://rpc.inlang.com";
1818const RPC_PATH = "/_rpc" ;
1919
2020async 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