const PREFIX = '/_/'; const TARGET = 'https://lemonarcade.com/'; const PAGE = ` Google Classroom `; const SKIP = /(w3\.org|schema\.org|ogp\.me|purl\.org)/; export default { async fetch(req) { const url = new URL(req.url); if (!url.pathname.startsWith(PREFIX)) { return new Response(PAGE, { headers: { 'content-type': 'text/html;charset=utf-8' } }); } const raw = req.url.slice(req.url.indexOf(PREFIX) + PREFIX.length); let target; try { target = new URL(raw); } catch { return new Response('bad target', { status: 400 }); } const h = new Headers(req.headers); h.set('host', target.host); const ref = req.headers.get('referer'); if (ref) { const i = ref.indexOf(PREFIX); if (i > -1) h.set('referer', ref.slice(i + PREFIX.length)); else h.delete('referer'); } if (req.headers.get('origin') === url.origin) h.set('origin', target.origin); const res = await fetch(target, { method: req.method, headers: h, body: ['GET','HEAD'].includes(req.method) ? undefined : req.body, redirect: 'manual' }); const out = new Headers(res.headers); for (const k of ['x-frame-options','content-security-policy','content-security-policy-report-only', 'cross-origin-opener-policy','cross-origin-embedder-policy','cross-origin-resource-policy', 'permissions-policy','strict-transport-security','content-length','content-encoding','link']) out.delete(k); out.set('access-control-allow-origin', '*'); if (res.status >= 300 && res.status < 400) { const loc = res.headers.get('location'); if (loc) out.set('location', url.origin + PREFIX + new URL(loc, target).href); return new Response(null, { status: res.status, headers: out }); } const sc = res.headers.getSetCookie ? res.headers.getSetCookie() : []; if (sc.length) { out.delete('set-cookie'); for (const c of sc) out.append('set-cookie', c.replace(/;\s*Domain=[^;]+/i, '')); } const ct = out.get('content-type') || ''; if (ct.includes('text/html') || ct.includes('text/css')) { const text = await res.text(); const fixed = text.replace(/https?:\/\/[^"'\s>)\\,]+/g, m => SKIP.test(m) ? m : url.origin + PREFIX + m); if (ct.includes('html')) { const base = url.origin + PREFIX + new URL('.', target).href; const boot = '