proxy-server / index.js
x-undefined-2's picture
Update index.js
feb5851 verified
/**
* 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(`<base href="https://x-undefined-2-proxy-server.hf.space/${url}" />`, {
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});
}
}