function IsValidURL(url) { try { new URL(url); return true; } catch (err) { return false; } } function RandomString() { const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" let res = "" for (let i = 0; i < 8; i++) { res += characters.charAt(Math.floor(Math.random() * characters.length)) } return res } export default { async fetch(request, env, ctx) { let request_url = new URL(request.url) if (request.method == "POST") { if (request_url.pathname.toLowerCase() == "/upload" && request.headers.get("token") == env.ACCESS_TOKEN) { let url = (await request.json()).URL if (IsValidURL(url)) { let slug = RandomString() while (true) { if (await env.stored_urls.get(slug) == null) { if (await env.stored_urls.put(slug, url) !== undefined) { return new Response(`{"error": {"code": 503, "message": "KV limit reached."}}`, {status: 503}) } else { break } } slug = RandomString() } return new Response(`{"data": {"slug": "${slug}"}}`, {status: 200}) } else { return new Response(`{"error": {"code": 400, "message": "Invalid URL."}}`, {status: 400}) } } return new Response(`{"error": {"code": 403, "message": "Unauthorized."}}`, {status: 403}) } else if (request.method == "GET") { let slug = request_url.pathname.substring(1) if (slug.length > 0) { let url = await env.stored_urls.get(slug) if (url !== null) { return Response.redirect(url, 301) } } return new Response(`{"error": {"code": 404, "message": "Redirect not found."}}`, {status: 404}) } }, };