| addEventListener('fetch', e => { |
| e.respondWith(handleRequest(e.request)); |
| }); |
|
|
| async function handleRequest(request) { |
| try { |
| |
| const targetHost = request.headers.get("x-co"); |
| |
| |
| const allowedHosts = ["api2.cursor.sh", "www.cursor.com"]; |
| const allowedPaths = [ |
| "/aiserver.v1.AiService/StreamChat", |
| "/aiserver.v1.AiService/StreamChatWeb", |
| "/auth/full_stripe_profile", |
| "/api/usage", |
| "/api/auth/me" |
| ]; |
|
|
| const url = new URL(request.url); |
|
|
| |
| if (!targetHost || !allowedHosts.includes(targetHost) || !allowedPaths.includes(url.pathname)) { |
| return new Response(null, { status: 403 }); |
| } |
|
|
| |
| const headers = new Headers(request.headers); |
| headers.delete("x-co"); |
| headers.set("Host", targetHost); |
|
|
| |
| const response = await fetch( |
| `https://${targetHost}${url.pathname}${url.search}`, |
| { |
| method: request.method, |
| headers: headers, |
| body: request.body |
| } |
| ); |
|
|
| |
| const responseHeaders = new Headers(response.headers); |
| responseHeaders.set("Access-Control-Allow-Origin", "*"); |
|
|
| return new Response(response.body, { |
| status: response.status, |
| headers: responseHeaders |
| }); |
|
|
| } catch (error) { |
| |
| console.error('Request failed:', error); |
| return new Response("Internal Server Error", { |
| status: 500, |
| headers: { "Content-Type": "text/plain" } |
| }); |
| } |
| } |
|
|