From 321f65a802451ef067c4364e3bb3f4461bffc60d Mon Sep 17 00:00:00 2001 From: Dicken Date: Fri, 12 Jun 2026 12:54:55 +0200 Subject: [PATCH] fix: CDX fetch ohne custom headers (CORS preflight vermeiden) --- frontend/src/tools/paywallkiller.jsx | 32 ++++++++++++++++++---------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/frontend/src/tools/paywallkiller.jsx b/frontend/src/tools/paywallkiller.jsx index 945a0e8..1eb46c7 100644 --- a/frontend/src/tools/paywallkiller.jsx +++ b/frontend/src/tools/paywallkiller.jsx @@ -13,30 +13,40 @@ function getDomain(url) { catch { return url; } } -// Wayback CDX – direkt im Browser (CORS: * → kein Server-Proxy nötig) +// Wayback CDX – direkt im Browser async function searchWayback(targetUrl) { const cdx = `https://web.archive.org/cdx/search/cdx?url=${encodeURIComponent(targetUrl)}&output=json&limit=1&fl=timestamp&filter=statuscode:200&fastLatest=true`; - const res = await fetch(cdx); - if (!res.ok) throw new Error(`CDX Fehler: ${res.status}`); + let res; + try { + // Ohne custom headers – minimaler Request damit CORS-Preflight entfällt + res = await fetch(cdx); + } catch (e) { + throw new Error('Netzwerkfehler: ' + e.message); + } + if (!res.ok) throw new Error(`CDX ${res.status}`); const data = await res.json(); if (!Array.isArray(data) || data.length < 2 || !data[1]?.[0]) return null; return `https://web.archive.org/web/${data[1][0]}/${targetUrl}`; } -// Wayback Save – direkt im Browser via no-cors fetch (fire-and-forget) -// Dann CDX pollen bis Snapshot erscheint +// Wayback Save + CDX-Polling async function saveAndPollWayback(targetUrl, onStatus) { - // Save abschießen (no-cors: kein Response lesbar, aber Request geht raus) + // Save via no-cors (kein lesbarer Response, aber Archivierung wird getriggert) try { - await fetch(`https://web.archive.org/save/${targetUrl}`, { mode: 'no-cors' }); - } catch { /* ignorieren – no-cors wirft immer */ } + fetch(`https://web.archive.org/save/${targetUrl}`, { + method: 'GET', + mode: 'no-cors', + }).catch(() => {}); + } catch {} // CDX pollen: 8x alle 5s = max 40s for (let i = 0; i < 8; i++) { - onStatus(`Warte auf Snapshot... (${(i+1)*5}s)`); await new Promise(r => setTimeout(r, 5000)); - const url = await searchWayback(targetUrl); - if (url) return url; + onStatus(`Warte auf Snapshot... (${(i + 1) * 5}s)`); + try { + const url = await searchWayback(targetUrl); + if (url) return url; + } catch {} } return null; }