// Cloudflare Worker Proxy katko.io -> Google Cloud Function const BACKEND_URL = "https://europe-west3-katko.cloudfunctions.net/katko_scraper_http"; export default { async fetch(request, env, ctx) { const url = new URL(request.url); // 1. Käsitellään CORS-esitarkistukset (OPTIONS) välittömästi suoraan Cloudflaressa (erittäin nopea!) if (request.method === "OPTIONS") { return new Response(null, { status: 204, headers: { "Access-Control-Allow-Origin": "https://katko.ai", "Access-Control-Allow-Methods": "GET, POST, OPTIONS", "Access-Control-Allow-Headers": "Content-Type, Authorization, X-Requested-With, X-API-Key", "Access-Control-Allow-Credentials": "true", "Access-Control-Max-Age": "86400" // Välimuistitetaan CORS-vastaus 24 tunniksi } }); } // Rakennetaan kohde-URL Cloud Functioniin säilyttäen polku ja hakuparametrit const targetUrl = new URL(BACKEND_URL + url.pathname + url.search); // Kopioidaan alkuperäisen pyynnön otsikot const newHeaders = new Headers(request.headers); // Asetetaan välityspalvelimen tunnistetiedot Google Cloudille newHeaders.set("X-Forwarded-Host", url.hostname); newHeaders.set("X-Forwarded-Proto", url.protocol.replace(":", "")); // Lähetetään pyyntö eteenpäin backendille (Google Cloudiin) try { const response = await fetch(targetUrl.toString(), { method: request.method, headers: newHeaders, body: request.method !== "GET" && request.method !== "HEAD" ? request.body : undefined, redirect: "manual" }); // Luodaan uusi vastaus ja tiukennetaan CORS-asetuksia sallimaan vain katko.ai const modifiedHeaders = new Headers(response.headers); modifiedHeaders.set("Access-Control-Allow-Origin", "https://katko.ai"); modifiedHeaders.set("Access-Control-Allow-Methods", "GET, POST, OPTIONS"); modifiedHeaders.set("Access-Control-Allow-Headers", "Content-Type, Authorization, X-Requested-With, X-API-Key"); modifiedHeaders.set("Access-Control-Allow-Credentials", "true"); return new Response(response.body, { status: response.status, statusText: response.statusText, headers: modifiedHeaders }); } catch (error) { return new Response(JSON.stringify({ success: false, error: "Backend-yhteysvirhe Cloudflaren välityspalvelimessa." }), { status: 502, headers: { "Content-Type": "application/json", "Access-Control-Allow-Origin": "https://katko.ai" } }); } } };