From 1ba7d93ea407f99b060103e0fb68ce1ced86a609 Mon Sep 17 00:00:00 2001 From: hunshnet <337490703@qq.com> Date: Thu, 9 Apr 2020 22:26:05 +0800 Subject: [PATCH] =?UTF-8?q?js=E7=89=88=E6=9C=AC=E6=95=B4=E5=90=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.js | 7 ++- index2.js | 147 ------------------------------------------------------ 2 files changed, 6 insertions(+), 148 deletions(-) delete mode 100644 index2.js diff --git a/index.js b/index.js index e477700..7d3464f 100644 --- a/index.js +++ b/index.js @@ -4,6 +4,11 @@ * static files (404.html, sw.js, conf.js) */ const ASSET_URL = 'https://hunshcn.github.io/gh-proxy' +// git使用cnpmjs镜像、分支文件使用jsDelivr镜像的开关,0为关闭,默认开启 +const Config = { + jsdelivr: 1, + cnpmjs: 1 +} /** @type {RequestInit} */ const PREFLIGHT_INIT = { @@ -62,7 +67,7 @@ async function fetchHandler(e) { const exp = /^(?:https?:\/\/)?github\.com\/.+?\/.+?\/(?:releases|archive)\/.*$/ const exp2 = /^(?:https?:\/\/)?github\.com\/.+?\/.+?\/(?:blob)\/.*$/ const exp3 = /^(?:https?:\/\/)?github\.com\/.+?\/.+?\/(?:info|git-upload-pack).*$/ - if (path.search(exp)===0) { + if (path.search(exp)===0 || !Config.jsdelivr && path.search(exp2)===0 || !Config.cnpmjs && path.search(exp3)===0) { return httpHandler(req, path) }else if(path.search(exp2)===0) { const newUrl = path.replace('/blob/', '@').replace(/^(?:https?:\/\/)?github\.com/, 'https://cdn.jsdelivr.net/gh') diff --git a/index2.js b/index2.js deleted file mode 100644 index 4ac974f..0000000 --- a/index2.js +++ /dev/null @@ -1,147 +0,0 @@ -'use strict' - -/** - * static files (404.html, sw.js, conf.js) - */ -const ASSET_URL = 'https://hunshcn.github.io/gh-proxy' - -/** @type {RequestInit} */ -const PREFLIGHT_INIT = { - status: 204, - headers: new Headers({ - 'access-control-allow-origin': '*', - 'access-control-allow-methods': 'GET,POST,PUT,PATCH,TRACE,DELETE,HEAD,OPTIONS', - 'access-control-max-age': '1728000', - }), -} - -/** - * @param {any} body - * @param {number} status - * @param {Object} headers - */ -function makeRes(body, status = 200, headers = {}) { - headers['access-control-allow-origin'] = '*' - return new Response(body, {status, headers}) -} - - -/** - * @param {string} urlStr - */ -function newUrl(urlStr) { - try { - return new URL(urlStr) - } catch (err) { - return null - } -} - - -addEventListener('fetch', e => { - const ret = fetchHandler(e) - .catch(err => makeRes('cfworker error:\n' + err.stack, 502)) - e.respondWith(ret) -}) - - -/** - * @param {FetchEvent} e - */ -async function fetchHandler(e) { - const req = e.request - const urlStr = req.url - const urlObj = new URL(urlStr) - let path = urlObj.searchParams.get('q') - if(path) - { - return Response.redirect('https://' + urlObj.host + '/' + path, 301) - } - // cfworker 会把路径中的 `//` 合并成 `/` - path = urlObj.href.substr(urlObj.origin.length + 1).replace(/^https?:\/+/, 'https://') - const exp = /^(?:https?:\/\/)?github\.com\/.+?\/.+?\/(?:releases|archive|info|git-upload-pack).*$/ - const exp2 = /^(?:https?:\/\/)?github\.com\/.+?\/.+?\/(?:blob)\/.*$/ - if (path.search(exp)===0) { - return httpHandler(req, path) - }else if(path.search(exp2)===0){ - const newUrl = path.replace('/blob/', '@').replace(/^(?:https?:\/\/)?github\.com/, 'https://cdn.jsdelivr.net/gh') - return Response.redirect(newUrl, 302) - } else { - return fetch(ASSET_URL + path) - } -} - - -/** - * @param {Request} req - * @param {string} pathname - */ -function httpHandler(req, pathname) { - const reqHdrRaw = req.headers - - // preflight - if (req.method === 'OPTIONS' && - reqHdrRaw.has('access-control-request-headers') - ) { - return new Response(null, PREFLIGHT_INIT) - } - - let rawLen = '' - - const reqHdrNew = new Headers(reqHdrRaw) - - const refer = reqHdrNew.get('referer') - - let urlStr = pathname - if (urlStr.startsWith('github')) { - urlStr = 'https://' + urlStr - } - const urlObj = newUrl(urlStr) - - /** @type {RequestInit} */ - const reqInit = { - method: req.method, - headers: reqHdrNew, - redirect: 'follow', - body: req.body - } - return proxy(urlObj, reqInit, rawLen, 0) -} - - -/** - * - * @param {URL} urlObj - * @param {RequestInit} reqInit - */ -async function proxy(urlObj, reqInit, rawLen) { - const res = await fetch(urlObj.href, reqInit) - const resHdrOld = res.headers - const resHdrNew = new Headers(resHdrOld) - - // verify - if (rawLen) { - const newLen = resHdrOld.get('content-length') || '' - const badLen = (rawLen !== newLen) - - if (badLen) { - return makeRes(res.body, 400, { - '--error': `bad len: ${newLen}, except: ${rawLen}`, - 'access-control-expose-headers': '--error', - }) - } - } - const status = res.status - resHdrNew.set('access-control-expose-headers', '*') - resHdrNew.set('access-control-allow-origin', '*') - - resHdrNew.delete('content-security-policy') - resHdrNew.delete('content-security-policy-report-only') - resHdrNew.delete('clear-site-data') - - return new Response(res.body, { - status, - headers: resHdrNew, - }) -} -