cloudflare-cors-anywhere/index.js

174 lines
6.4 KiB
JavaScript
Raw Normal View History

2019-07-15 22:55:41 +08:00
/*
CORS Anywhere as a Cloudflare Worker!
(c) 2019 by Zibri (www.zibri.org)
email: zibri AT zibri DOT org
2019-07-16 21:18:31 +08:00
https://github.com/Zibri/cloudflare-cors-anywhere
2019-07-15 22:55:41 +08:00
*/
2019-07-19 19:41:06 +08:00
/*
2019-07-15 22:55:41 +08:00
whitelist = [ "^http.?://www.zibri.org$", "zibri.org$", "test\\..*" ]; // regexp for whitelisted urls
2019-07-19 19:41:06 +08:00
*/
2019-07-15 22:48:53 +08:00
2019-07-21 23:35:05 +08:00
blacklist = [ ]; // regexp for blacklisted urls
whitelist = [ ".*" ]; // regexp for whitelisted origins
2019-07-19 19:41:06 +08:00
function isListed(uri,listing) {
2019-07-15 22:48:53 +08:00
var ret=false;
if (typeof uri == "string") {
2019-07-19 19:41:06 +08:00
listing.forEach((m)=>{
2019-07-15 22:48:53 +08:00
if (uri.match(m)!=null) ret=true;
});
2019-07-19 19:41:06 +08:00
} else { // decide what to do when Origin is null
2019-07-15 22:48:53 +08:00
ret=true; // true accepts null origins false rejects them.
}
return ret;
}
2019-07-15 18:29:18 +08:00
addEventListener("fetch", async event=>{
2019-07-19 01:11:34 +08:00
event.respondWith((async function() {
2019-07-21 23:35:05 +08:00
isOPTIONS = (event.request.method == "OPTIONS");
2019-07-15 18:29:18 +08:00
var origin_url = new URL(event.request.url);
2019-07-15 22:48:53 +08:00
function fix(myHeaders) {
2019-07-19 00:03:50 +08:00
// myHeaders.set("Access-Control-Allow-Origin", "*");
2023-01-08 20:53:27 +08:00
myHeaders.set("Cache-Control","no-cache");
2019-07-23 17:51:48 +08:00
myHeaders.set("Access-Control-Allow-Origin", event.request.headers.get("Origin"));
2019-07-21 23:35:05 +08:00
if (isOPTIONS) {
2019-07-23 17:51:48 +08:00
myHeaders.set("Access-Control-Allow-Methods", event.request.headers.get("access-control-request-method"));
2019-07-21 23:35:05 +08:00
acrh = event.request.headers.get("access-control-request-headers");
//myHeaders.set("Access-Control-Allow-Credentials", "true");
if (acrh) {
2019-07-23 17:51:48 +08:00
myHeaders.set("Access-Control-Allow-Headers", acrh);
2019-07-21 23:35:05 +08:00
}
2019-07-15 18:29:18 +08:00
2019-07-21 23:35:05 +08:00
myHeaders.delete("X-Content-Type-Options");
2019-07-15 18:29:18 +08:00
}
2019-07-15 22:48:53 +08:00
return myHeaders;
}
var fetch_url = decodeURIComponent(decodeURIComponent(origin_url.search.substr(1)));
2019-07-19 19:41:06 +08:00
2019-07-15 22:48:53 +08:00
var orig = event.request.headers.get("Origin");
2019-07-21 23:35:05 +08:00
var remIp = event.request.headers.get("CF-Connecting-IP");
2019-07-19 19:41:06 +08:00
2019-07-23 17:55:47 +08:00
if ((!isListed(fetch_url, blacklist)) && (isListed(orig, whitelist))) {
2019-07-19 00:03:50 +08:00
xheaders = event.request.headers.get("x-cors-headers");
if (xheaders != null) {
try {
xheaders = JSON.parse(xheaders);
} catch (e) {}
}
2019-07-15 22:48:53 +08:00
if (origin_url.search.startsWith("?")) {
2023-01-08 20:53:27 +08:00
//
console.log(isOPTIONS)
if(isOPTIONS){
var myHeaders = new Headers();
myHeaders = fix(myHeaders);
return new Response("helo",
{status: 200, headers: myHeaders}
);
}
2019-07-19 00:03:50 +08:00
recv_headers = {};
for (var pair of event.request.headers.entries()) {
2019-07-23 17:55:47 +08:00
if ((pair[0].match("^origin") == null) &&
(pair[0].match("eferer") == null) &&
(pair[0].match("^cf-") == null) &&
(pair[0].match("^x-forw") == null) &&
(pair[0].match("^x-cors-headers") == null)
) recv_headers[pair[0]] = pair[1];
2019-07-19 00:03:50 +08:00
}
2019-07-23 17:55:47 +08:00
2019-07-19 00:03:50 +08:00
if (xheaders != null) {
Object.entries(xheaders).forEach((c)=>recv_headers[c[0]] = c[1]);
}
newreq = new Request(event.request,{
2022-02-14 01:39:55 +08:00
"redirect": "follow",
2019-07-19 00:03:50 +08:00
"headers": recv_headers
});
2019-07-19 01:11:34 +08:00
2019-07-19 00:03:50 +08:00
var response = await fetch(fetch_url,newreq);
2019-07-19 01:11:34 +08:00
var myHeaders = new Headers(response.headers);
2019-07-19 00:03:50 +08:00
cors_headers = [];
2019-07-19 01:11:34 +08:00
allh = {};
for (var pair of response.headers.entries()) {
cors_headers.push(pair[0]);
2019-07-19 01:11:34 +08:00
allh[pair[0]] = pair[1];
}
2019-07-21 23:35:05 +08:00
cors_headers.push("cors-received-headers");
2019-07-15 22:48:53 +08:00
myHeaders = fix(myHeaders);
2019-07-15 18:29:18 +08:00
2019-07-19 00:03:50 +08:00
myHeaders.set("Access-Control-Expose-Headers", cors_headers.join(","));
2019-07-19 01:11:34 +08:00
2019-07-23 17:51:48 +08:00
myHeaders.set("cors-received-headers", JSON.stringify(allh));
2019-07-19 01:11:34 +08:00
2019-07-21 23:35:05 +08:00
if (isOPTIONS) {
var body = null;
} else {
var body = await response.arrayBuffer();
}
2019-07-15 22:48:53 +08:00
var init = {
2019-07-17 23:35:04 +08:00
headers: myHeaders,
2019-07-21 23:35:05 +08:00
status: (isOPTIONS ? 200 : response.status),
statusText: (isOPTIONS ? "OK" : response.statusText)
2019-07-15 22:48:53 +08:00
};
return new Response(body,init);
2019-07-15 18:29:18 +08:00
2019-07-15 22:48:53 +08:00
} else {
var myHeaders = new Headers();
myHeaders = fix(myHeaders);
2019-07-15 18:29:18 +08:00
2019-07-15 22:48:53 +08:00
if (typeof event.request.cf != "undefined") {
if (typeof event.request.cf.country != "undefined") {
country = event.request.cf.country;
} else
country = false;
2019-07-15 18:29:18 +08:00
2019-07-15 22:48:53 +08:00
if (typeof event.request.cf.colo != "undefined") {
colo = event.request.cf.colo;
} else
colo = false;
} else {
country = false;
2019-07-15 18:29:18 +08:00
colo = false;
2019-07-15 22:48:53 +08:00
}
2019-07-15 18:29:18 +08:00
2019-07-15 22:48:53 +08:00
return new Response(
2019-07-21 23:35:05 +08:00
"CLOUDFLARE-CORS-ANYWHERE\n\n" +
"Source:\nhttps://github.com/Zibri/cloudflare-cors-anywhere\n\n" +
2019-07-23 00:43:10 +08:00
"Usage:\n" + origin_url.origin + "/?uri\n\n" +
"Donate:\nhttps://paypal.me/Zibri/5\n\n" +
2019-07-21 23:35:05 +08:00
"Limits: 100,000 requests/day\n" +
" 1,000 requests/10 minutes\n\n" +
(orig != null ? "Origin: " + orig + "\n" : "") +
"Ip: " + remIp + "\n" +
(country ? "Country: " + country + "\n" : "") +
(colo ? "Datacenter: " + colo + "\n" : "") + "\n" +
((xheaders != null) ? "\nx-cors-headers: " + JSON.stringify(xheaders) : ""),
{status: 200, headers: myHeaders}
);
2019-07-15 22:48:53 +08:00
}
2019-07-19 00:03:50 +08:00
} else {
2019-07-19 19:41:06 +08:00
return new Response(
2019-07-27 16:58:00 +08:00
"Create your own cors proxy</br>\n" +
"<a href='https://github.com/Zibri/cloudflare-cors-anywhere'>https://github.com/Zibri/cloudflare-cors-anywhere</a></br>\n" +
"\nDonate</br>\n" +
"<a href='https://paypal.me/Zibri/5'>https://paypal.me/Zibri/5</a>\n",
{
status: 403,
statusText: 'Forbidden',
headers: {
"Content-Type": "text/html"
}
});
2019-07-19 00:03:50 +08:00
}
2019-07-15 18:29:18 +08:00
}
)());
2023-01-08 20:53:27 +08:00
});