SneakySquid icon

URL Shortener Cloudflare Worker

SneakySquid | PRO | 05/22/24 05:52:21 PM UTC (Edited) | 0 ⭐ | 1384 👁️ | Never ⏰ | []
JavaScript |

1.68 KB

|

None

|

0 👍

/

0 👎

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