Skip to content

Instantly share code, notes, and snippets.

@jaredly
Created June 4, 2022 03:31

Revisions

  1. jaredly created this gist Jun 4, 2022.
    45 changes: 45 additions & 0 deletions cors-proxy.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,45 @@
    /**
    * Usage:
    * https://worker-name.myusername.workers.dev/?url=http://google.com
    */

    addEventListener('fetch', event => {
    event.respondWith(handleRequest(event.request))
    })

    /**
    * Respond to the request
    * @param {Request} request
    */
    async function handleRequest(request) {
    if (request.method === "OPTIONS") {
    return new Response('ok', {headers: {
    "access-control-allow-origin": request.headers.get('origin'),
    "access-control-allow-methods": "GET",
    "access-control-allow-headers": request.headers.get("access-control-request-headers"),
    }})
    }

    const url = new URL(request.url)
    const requested_url = url.searchParams.get('url')
    const userAgent = url.searchParams.get('userAgent')
    const headers = {...request.headers}
    if (userAgent) {
    headers["User-Agent"] = userAgent
    }

    const res = await fetch(requested_url, {
    headers: headers})
    const body = await res.arrayBuffer()
    const resHeaders = {}
    for (let [k, v] of res.headers.entries()) {
    resHeaders[k] = v
    }
    return new Response(body, {
    status: res.status,
    headers: {
    ...resHeaders,
    "access-control-allow-origin": request.headers.get('origin'),
    }
    })
    }