/* usage: // Array to store the list of urls to fetch, max 50 urls at one time var arr = ["https://developer.mozilla.org/en-US/docs/Web/API/Request","https://en.wikipedia.org/"] // paste your cloudflare workers dev url here fetch('urlofcloudflareworkerdev',{ method: 'POST', body: JSON.stringify(arr) }) .then(response => response.text()) .then(console.log) */ addEventListener('fetch', event => { event.respondWith(handleRequest(event.request)) }) /** * Respond to the request * @param {Request} request * */ const responseinit = { headers: { 'content-type': 'text/html;charset=UTF-8', 'Access-Control-Allow-Origin': '*', 'Vary': 'Origin', }, } async function handleRequest(request) { // cloudflare sends differet ip address each time from fixed pool of size 3-5 // return await fetch('https://httpbin.org/ip').then(response => response.text()).then(data => new Response(data,responseinit) ) // https://community.cloudflare.com/t/how-do-i-read-the-request-body-as-json/155393 let urlArr = await request.clone().json() // Emulating the request received let browserrequest = new Request(request) browserrequest.headers.delete('Origin') browserrequest.headers.delete('referer') let responsearr = [] let results = "" for (var url of urlArr) { fetchRes = fetch(url, { headers: browserrequest.headers }) .then(response => textWIthUrl(response)) .then(data => results = results.concat(data)) .catch(error => results.concat("" + error.toString() + "")) responsearr.push(fetchRes) } return await Promise.allSettled(responsearr).then(() => { return new Response(results, responseinit) }) } async function textWIthUrl(response) { // we only want responses which are text if (response.headers.get('content-type').toLowerCase().startsWith('text/')) { let okstatus = await response.ok let urlval = await response.url let newval = "" + okstatus + "" let res = await response.text() return newval + res } return "" }