From f6f7c6bbac2c7ebad14787cf0e16d12867d0f3cf Mon Sep 17 00:00:00 2001 From: qkqpttgf <45693631+qkqpttgf@users.noreply.github.com> Date: Wed, 30 Sep 2020 18:51:46 +0800 Subject: [PATCH] can proxy FC/SCF/CFC/FG --- CFWorkers.js | 86 ++++++++++++++++++++++++++++++++++------------------ 1 file changed, 56 insertions(+), 30 deletions(-) diff --git a/CFWorkers.js b/CFWorkers.js index 663bf17..55f57dd 100644 --- a/CFWorkers.js +++ b/CFWorkers.js @@ -1,8 +1,12 @@ // odd, 单日 -const SingleDay = 'aaa1.herokuapp.com' +const SingleDay = 'https://aaa1.herokuapp.com' // even, 双日 -const DoubleDay = 'bbb2.herokuapp.com' +const DoubleDay = 'https://bbb2.herokuapp.com' + +//const SingleDay = 'https://153xxxxx0.cn-hongkong.fc.aliyuncs.com/2016-08-15/proxy/onedrive/xxx/' +//const DoubleDay = 'https://153xxxxx0.cn-hongkong.fc.aliyuncs.com/2016-08-15/proxy/onedrive/xxx/' + // CF proxy all, 一切给CF代理,true/false const CFproxy = true @@ -17,48 +21,70 @@ addEventListener('fetch', event => { let url=new URL(event.request.url); if (url.protocol == 'http:') { url.protocol = 'https:' - response = Response.redirect(url.href); - event.respondWith( response ); + event.respondWith( Response.redirect(url.href) ) } else { + let response = null; let nd = new Date(); if (nd.getDate()%2) { host = SingleDay } else { host = DoubleDay } - if (!CFproxy) { - url.hostname=host; - let request=new Request(url,event.request); - event.respondWith( fetch(request) ) - } else { - event.respondWith( fetchAndApply(event.request) ); - } + if (host.substr(0, 7)!='http://'&&host.substr(0, 8)!='https://') host = 'http://' + host; + + response = fetchAndApply(host, event.request); + + event.respondWith( response ); } }) -async function fetchAndApply(request) { +async function fetchAndApply(host, request) { + let f_url = new URL(request.url); + let a_url = new URL(host); + let replace_path = a_url.pathname; + if (replace_path.substr(replace_path.length-1)!='/') replace_path += '/'; + let replaced_path = '/'; + let query = f_url.search; + let path = f_url.pathname; + if (host.substr(host.length-1)=='/') path = path.substr(1); + f_url.href = host + path + query; + let response = null; - let url = new URL(request.url); - url.host = host; + if (!CFproxy) { + response = await fetch(request); + } else { + let method = request.method; + let body = request.body; + let request_headers = request.headers; + let new_request_headers = new Headers(request_headers); + new_request_headers.set('Host', f_url.host); + new_request_headers.set('Referer', request.url); - let method = request.method; - let body = request.body; - let request_headers = request.headers; - let new_request_headers = new Headers(request_headers); + response = await fetch(f_url.href, { + method: method, + body: body, + headers: new_request_headers + }); + } - new_request_headers.set('Host', url.host); - new_request_headers.set('Referer', request.url); + let out_headers = new Headers(response.headers); + if (out_headers.get('Content-Disposition')=='attachment') out_headers.delete('Content-Disposition'); + let out_body = null; + let contentType = out_headers.get('content-type'); + if (contentType.includes("application/text")) { + out_body = await response.text(); + while (out_body.includes(replace_path)) out_body = out_body.replace(replace_path, replaced_path); + } else if (contentType.includes("text/html")) { + out_body = await response.text(); + while (out_body.includes(replace_path)) out_body = out_body.replace(replace_path, replaced_path); + } else { + out_body = await response.body; + } - let original_response = await fetch(url.href, { - method: method, - body: body, - headers: new_request_headers - }); - - response = new Response(original_response.body, { - status: original_response.status, - headers: original_response.headers + let out_response = new Response(out_body, { + status: response.status, + headers: out_headers }) - return response; + return out_response; }