From 82cfad9f67c112f1b540026659a37a8cbfb06030 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 15 Mar 2026 03:44:47 +0000 Subject: [PATCH] Switch production CORS proxy from Cloudflare Worker to corsproxy.io The reservauto.net API was blocking Cloudflare IP ranges, causing all production requests to fail. Replace the Cloudflare Worker proxy with corsproxy.io using an axios request interceptor that rewrites each request URL to the corsproxy.io/?url= format at runtime. Also removes the now-unused VITE_CORS_PROXY_URL env var from env.d.ts and the deploy workflow. https://claude.ai/code/session_011UEHHFzjkX75EV5LNeK76v --- .github/workflows/deploy.yml | 2 -- env.d.ts | 2 +- src/http-common.ts | 21 +++++++++++++++++++-- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 135e762..2bc8017 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -27,8 +27,6 @@ jobs: - run: npm ci - run: npm run build - env: - VITE_CORS_PROXY_URL: ${{ vars.VITE_CORS_PROXY_URL }} - run: cp dist/index.html dist/404.html - uses: actions/upload-pages-artifact@v3 diff --git a/env.d.ts b/env.d.ts index f4de909..084d059 100644 --- a/env.d.ts +++ b/env.d.ts @@ -1,7 +1,7 @@ /// interface ImportMetaEnv { - readonly VITE_CORS_PROXY_URL?: string; + // no custom env vars needed — production uses corsproxy.io } declare module '*.vue' { diff --git a/src/http-common.ts b/src/http-common.ts index 03dbf71..e0f0d0b 100644 --- a/src/http-common.ts +++ b/src/http-common.ts @@ -1,14 +1,31 @@ import axios from 'axios'; -// Public API client — proxied through Vite in dev, Cloudflare Worker in prod. +const TARGET_BASE = 'https://www.reservauto.net'; + +// Public API client — proxied through Vite in dev, corsproxy.io in prod. const apiClient = axios.create({ - baseURL: import.meta.env.DEV ? '/api' : (import.meta.env.VITE_CORS_PROXY_URL || 'https://communauto-cors-proxy..workers.dev'), + baseURL: import.meta.env.DEV ? '/api' : TARGET_BASE, headers: { Accept: 'application/json', 'Content-Type': 'application/json', }, }); +if (!import.meta.env.DEV) { + apiClient.interceptors.request.use((config) => { + const targetUrl = new URL(config.url!, TARGET_BASE); + if (config.params) { + for (const [k, v] of Object.entries(config.params as Record)) { + if (v !== undefined && v !== null) targetUrl.searchParams.set(k, String(v)); + } + config.params = undefined; + } + config.baseURL = ''; + config.url = `https://corsproxy.io/?url=${encodeURIComponent(targetUrl.toString())}`; + return config; + }); +} + // Authenticated REST API client — direct to restapifrontoffice const restApi = axios.create({ baseURL: 'https://restapifrontoffice.reservauto.net',