Advertisement
SneakySquid

URL Shortener Cloudflare Worker

May 21st, 2024 (edited)
1,028
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. function IsValidURL(url) {
  2.     try {
  3.         new URL(url);
  4.         return true;
  5.     } catch (err) {
  6.         return false;
  7.     }
  8. }
  9.  
  10. function RandomString() {
  11.     const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
  12.     let res = ""
  13.  
  14.     for (let i = 0; i < 8; i++) {
  15.         res += characters.charAt(Math.floor(Math.random() * characters.length))
  16.     }
  17.  
  18.     return res
  19. }
  20.  
  21. export default {
  22.     async fetch(request, env, ctx) {
  23.         let request_url = new URL(request.url)
  24.  
  25.         if (request.method == "POST") {
  26.             if (request_url.pathname.toLowerCase() == "/upload" && request.headers.get("token") == env.ACCESS_TOKEN) {
  27.                 let url = (await request.json()).URL
  28.  
  29.                 if (IsValidURL(url)) {
  30.                     let slug = RandomString()
  31.  
  32.                     while (true) {
  33.                         if (await env.stored_urls.get(slug) == null) {
  34.                             if (await env.stored_urls.put(slug, url) !== undefined) {
  35.                                 return new Response(`{"error": {"code": 503, "message": "KV limit reached."}}`, {status: 503})
  36.                             } else {
  37.                                 break
  38.                             }
  39.                         }
  40.  
  41.                         slug = RandomString()
  42.                     }
  43.  
  44.                     return new Response(`{"data": {"slug": "${slug}"}}`, {status: 200})
  45.                 } else {
  46.                     return new Response(`{"error": {"code": 400, "message": "Invalid URL."}}`, {status: 400})
  47.                 }
  48.             }
  49.  
  50.             return new Response(`{"error": {"code": 403, "message": "Unauthorized."}}`, {status: 403})
  51.         } else if (request.method == "GET") {
  52.             let slug = request_url.pathname.substring(1)
  53.  
  54.             if (slug.length > 0) {
  55.                 let url = await env.stored_urls.get(slug)
  56.  
  57.                 if (url !== null) {
  58.                     return Response.redirect(url, 301)
  59.                 }
  60.             }
  61.  
  62.             return new Response(`{"error": {"code": 404, "message": "Redirect not found."}}`, {status: 404})
  63.         }
  64.     },
  65. };
  66.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement