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})
}
},
};
Comments