/** * Respond to the request */ async function handleRequest(event) { const { request } = event; //请求头部、返回对象 let reqHeaders = new Headers(request.headers), outBody, outStatus = 200, outStatusText = 'OK', outCt = null, outHeaders = new Headers({ "x-url": request.url, "Access-Control-Allow-Origin": reqHeaders.get('Origin'), "Access-Control-Allow-Methods": "GET, POST, PUT, PATCH, DELETE, OPTIONS", "Access-Control-Allow-Headers": reqHeaders.get('Access-Control-Allow-Headers') || "Accept, Authorization, Cache-Control, Content-Type, DNT, If-Modified-Since, Keep-Alive, Origin, User-Agent, X-Requested-With, Token, x-access-token, Notion-Version" }); let url = request.url; //取域名第一个斜杠后的所有信息为代理链接 url = decodeURIComponent(request.url.replace("http://x-undefined-2-proxy-server.hf.space/", "")); let refer = reqHeaders.get("Referer") let cookie = reqHeaders.get("Cookie") try { //需要忽略的代理 if (request.method == "OPTIONS" && reqHeaders.has('access-control-request-headers')) { //输出提示 return new Response(null, PREFLIGHT_INIT) } //阻断 //补上前缀 http:// url = url.replace(/https:(\/+)*/,'https://').replace(/http:(\/+)*/, 'http://') if (url.indexOf("://") == -1) { if(refer){ refer = refer.replace("https://x-undefined-2-proxy-server.hf.space/", "") let xref = refer.substr(0, refer.indexOf('/', 10)+1) url = xref + url; } } let domain = url.substr(0, url.indexOf('/', 10)+1); if(refer){ refer = refer.replace("https://x-undefined-2-proxy-server.hf.space/", "") domain = refer.substr(0, refer.indexOf('/', 10)+1) // url = domain + url } outHeaders.set("xxx_url", url) outHeaders.set("xxx_domain", domain) //构建 fetch 参数 let fp = { method: request.method, headers: {} } //保留头部其它信息 let he = reqHeaders.entries(); for (let h of he) { if (!['content-length'].includes(h[0])) { fp.headers[h[0]] = h[1]; } } // 是否带 body if (["POST", "PUT", "PATCH", "DELETE"].indexOf(request.method) >= 0) { const ct = (reqHeaders.get('content-type') || "").toLowerCase(); if (ct.includes('application/json')) { let requestJSON = await request.json() console.log(typeof requestJSON) fp.body = JSON.stringify(requestJSON); } else if (ct.includes('application/text') || ct.includes('text/html')) { fp.body = await request.text(); } else if (ct.includes('form')) { fp.body = await request.formData(); } else { fp.body = await request.blob(); } } console.log("parsed url:", url, domain); // 发起 fetch let fr = (await fetch(new URL(url), fp)); outCt = fr.headers.get('content-type'); if(outCt && (outCt.includes('application/text') || outCt.includes('text/html'))) { try { // 添加base let newFr = new HTMLRewriter() .on("head", { element(element) { element.prepend(``, { html: true }) }, }) .on("link", { element(element) { let href = element.getAttribute("href") if(href){ if(href.indexOf("https://") == 0){ element.setAttribute("href", "https://x-undefined-2-proxy-server.hf.space/"+href); } else if(href[0] == '/') { element.setAttribute("href", "https://x-undefined-2-proxy-server.hf.space/"+domain.substr(0, domain.lastIndexOf('/'))+href); } else { element.setAttribute("href", request.url+href); } } }, }) .on("script", { element(element) { let href = element.getAttribute("src") if(href){ if(href.indexOf("https://") == 0){ element.setAttribute("src", "https://x-undefined-2-proxy-server.hf.space/"+href); } else if(href[0] == '/') { element.setAttribute("src", "https://x-undefined-2-proxy-server.hf.space/"+domain.substr(0, domain.lastIndexOf('/'))+href); } else { element.setAttribute("src", request.url+href); } } }, }) .on("img", { element(element) { let href = element.getAttribute("src") if(href){ if(href.indexOf("https://") == 0){ element.setAttribute("src", "https://x-undefined-2-proxy-server.hf.space/"+href); } else if(href[0] == '/') { element.setAttribute("src", "https://x-undefined-2-proxy-server.hf.space/"+domain.substr(0, domain.lastIndexOf('/'))+href); } else if(href.indexOf("data:image") == 0){ } else { element.setAttribute("src", request.url+href); } } }, }) .on("form", { element(element) { let href = element.getAttribute("action") if(href){ if(href.indexOf("https://") == 0){ element.setAttribute("action", "https://x-undefined-2-proxy-server.hf.space/"+href); } else if(href[0] == '/') { element.setAttribute("action", "https://x-undefined-2-proxy-server.hf.space/"+domain.substr(0, domain.lastIndexOf('/'))+href); } else { element.setAttribute("action", request.url+href); } } }, }) .on("a", { element(element) { let href = element.getAttribute("href") if(href){ if(href.indexOf("https://") == 0){ element.setAttribute("href", "https://x-undefined-2-proxy-server.hf.space/"+href); } else if(href[0] == '/') { element.setAttribute("href", "https://x-undefined-2-proxy-server.hf.space/"+domain.substr(0, domain.lastIndexOf('/'))+href); } else { element.setAttribute("href", request.url+href); } } }, }) .transform(fr) outHeaders.set("error", "noerror"); fr = newFr } catch(e) { outHeaders.set("error", e); } } for (const [key, value] of fr.headers.entries()) { if(key =="Content-Security-Policy" || key =="content-security-policy"){ outHeaders.set(key, value.replaceAll("github.githubassets.com", "x-undefined-2-proxy-server.hf.space github.githubassets.com").replaceAll("script-src .*?;", "script-src 'self' 'unsafe-inline';")); } } outHeaders.set("Access-Control-Allow-Origin", "x-undefined-2-proxy-server.hf.space") outHeaders.set("Access-Control-Allow-Methods", "*") outHeaders.set("Access-Control-Allow-Credentials", "true") outStatus = fr.status; outStatusText = fr.statusText; outBody = fr.body; console.log(fr.body); outBody = injectOutBody(url, outBody) } catch (err) { outHeaders.set("hasError", err); outCt = "application/json"; outBody = JSON.stringify({ code: -1, msg: JSON.stringify(err.stack) || err }); } finally { outHeaders.set("x_Url_ext", request.url) outHeaders.set("x_Refer", refer) } //设置类型 if (outCt && outCt != "") { outHeaders.set("content-type", outCt); } let response = new Response(outBody, { status: outStatus, statusText: outStatusText, headers: outHeaders }) return response; // return new Response('OK', { status: 200 }) } /** * 阻断器 */ const blocker = { keys: [".m3u8", ".ts", ".acc", ".m4s", "photocall.tv", "googlevideo.com" ], check: function (url) { url = url.toLowerCase(); let len = blocker.keys.filter(x => url.includes(x)).length; return len != 0; } } const injectOutBody = (url, body)=>{ // if(url.includes("huggingface.co") && url.endsWith("index.js")) { // let domain = url.substr(0, url.indexOf("/", 9)) // console.log(body) // return body.text();//.replace(/href: \"(.*?)\"/ig, "href:\"https://x-undefined-2-proxy-server.hf.space/"+domain+"$1\"") // } return body; } export default{ async fetch(request, event){ return handleRequest({request}); } }