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 = '