1
0
zjcqoo 6 жил өмнө
parent
commit
6b69387e41
3 өөрчлөгдсөн 86 нэмэгдсэн , 69 устгасан
  1. 4 2
      api.conf
  2. 46 31
      cf-worker/index.js
  3. 36 36
      lua/http-dec-req-hdr.lua

+ 4 - 2
api.conf

@@ -15,7 +15,7 @@ location = /error {
   more_set_headers
     'access-control-allow-origin: *'
     'access-control-expose-headers: gateway-err--'
-    'gateway-err--: {"msg": "$arg_msg", "addr": "$upstream_addr"}'
+    'gateway-err--: {"msg": "$arg_msg", "addr": "$upstream_addr", "url": "$arg_url"}'
   ;
   return              204;
 }
@@ -34,7 +34,9 @@ location = /preflight {
 
 # 该接口已作废
 location = /http {
-  rewrite             ^   /error?msg=API_OBSOLETED;
+  access_log          off;
+  more_set_headers    'access-control-allow-origin: *';
+  return              200  "当前站点已废弃,请访问新站点 https://jsproxy-demo.tk";
 }
 
 # HTTP(S) Proxy

+ 46 - 31
cf-worker/index.js

@@ -14,7 +14,6 @@ const PREFLIGHT_INIT = {
   headers: new Headers({
     'access-control-allow-origin': '*',
     'access-control-allow-methods': 'GET,POST,PUT,PATCH,TRACE,DELETE,HEAD,OPTIONS',
-    'access-control-allow-headers': '--raw-info,--level,--url,--referer,--cookie,--origin,--ext,--aceh,--ver,--type,--mode,accept,accept-charset,accept-encoding,accept-language,accept-datetime,authorization,cache-control,content-length,content-type,date,if-match,if-modified-since,if-none-match,if-range,if-unmodified-since,max-forwards,pragma,range,te,upgrade,upgrade-insecure-requests,x-requested-with,chrome-proxy,purpose',
     'access-control-max-age': '1728000',
   }),
 }
@@ -55,11 +54,13 @@ async function fetchHandler(e) {
     })
   }
 
-  if (pathname.startsWith('/http')) {
-    return httpHandler(req)
+  if (pathname.startsWith('/http/')) {
+    return httpHandler(req, pathname)
   }
 
   switch (pathname) {
+  case '/http':
+    return makeRes('请更新 cfworker 到最新版本!')
   case '/ws':
     return makeRes('not support', 400)
   case '/works':
@@ -73,8 +74,9 @@ async function fetchHandler(e) {
 
 /**
  * @param {Request} req
+ * @param {string} pathname
  */
-function httpHandler(req) {
+function httpHandler(req, pathname) {
   const reqHdrRaw = req.headers
   if (reqHdrRaw.has('x-jsproxy')) {
     return Response.error()
@@ -87,13 +89,7 @@ function httpHandler(req) {
     return new Response(null, PREFLIGHT_INIT)
   }
 
-  const urlStr = req.url.substr(6)
-  try {
-    var urlObj = new URL(urlStr)
-  } catch (err) {
-    return makeRes('invalid url: ' + urlStr, 403)
-  }
-
+  let urlStr = ''
   let acehOld = false
   let rawSvr = ''
   let rawLen = ''
@@ -104,32 +100,51 @@ function httpHandler(req) {
 
   // 此处逻辑和 http-dec-req-hdr.lua 大致相同
   // https://github.com/EtherDream/jsproxy/blob/master/lua/http-dec-req-hdr.lua
-  const {sys, ext} = JSON.parse(reqHdrNew.get('accept'))
-
-  // 系统信息
-  for (const [k, v] of Object.entries(sys)) {
-    switch (k) {
-    case 'aceh':
-      acehOld = true
-      break
-    case 'raw-info':
-      [rawSvr, rawLen, rawEtag] = v.split('|')
-      break
+  const refer = reqHdrNew.get('referer')
+  const query = refer.substr(refer.indexOf('?') + 1)
+  const param = new URLSearchParams(query)
+
+  for (const [k, v] of Object.entries(param)) {
+    if (k.substr(0, 2) === '--') {
+      // 系统信息
+      switch (k.substr(2)) {
+      case 'url':
+        urlStr = v
+        break
+      case 'aceh':
+        acehOld = true
+        break
+      case 'raw-info':
+        [rawSvr, rawLen, rawEtag] = v.split('|')
+        break
+      }
+    } else {
+      // 还原 HTTP 请求头
+      if (v) {
+        reqHdrNew.set(k, v)
+      } else {
+        reqHdrNew.delete(k)
+      }
     }
   }
+  if (!param.has('referer')) {
+    reqHdrNew.delete('referer')
+  }
 
-  // 原始 HTTP 字段
-  let hasRawAccept = false
+  if (!urlStr) {
+    urlStr = pathname.substr('/http/'.length)
+  }
 
-  for (const [k, v] of Object.entries(ext)) {
-    if (k === 'accept') {
-      hasRawAccept = true
-    }
-    reqHdrNew.set(k, v)
+  // cfworker 会把路径中的 `//` 合并成 `/`
+  const m = urlStr.match(/^https?:(\/+)/)
+  if (m && m[1] !== '//') {
+    urlStr = urlStr.replace('/', '//')
   }
 
-  if (!hasRawAccept) {
-    reqHdrNew.delete('accept')
+  try {
+    var urlObj = new URL(urlStr)
+  } catch (err) {
+    return makeRes('invalid url: ' + urlStr, 403)
   }
 
   /** @type {RequestInit} */

+ 36 - 36
lua/http-dec-req-hdr.lua

@@ -1,47 +1,47 @@
 -- 还原 HTTP 请求头
--- 前端只保留简单字段(防止出现 preflight),
--- 其余字段及系统信息,存储在 Accept 字段里(JSON 格式)。
+local hasRawUrl = false
+local hasRawRefer = false
 
-local cjson = require('cjson')
-local hdrs, err = ngx.req.get_headers()
-ngx.log(ngx.ALERT, 'accept:' .. hdrs['accept'])
-local info = ngx.unescape_uri(hdrs['accept'])
-local json = cjson.decode(info)
+local hdrs = ngx.req.get_headers()
+local refer = hdrs['referer']
+local query = refer:sub(refer:find('?', 10, true) + 1)
+local param = ngx.decode_args(query)
 
--- 系统信息
-local sys = json['sys']
 
-for k, v in pairs(sys) do
-  if k == 'ver' then
-    ngx.var._ver = v
-  elseif k == 'type' then
-    ngx.var._type = v
-  elseif k == 'mode' then
-    ngx.var._mode = v
-  elseif k == 'aceh' then
-    ngx.ctx._acehOld = true
-  elseif k == 'level' then
-    ngx.var._level = v
-    ngx.ctx._level = tonumber(v)
-  end
-end
+for k, v in pairs(param) do
+  if k:sub(1, 2) == '--' then
+    k = k:sub(3)
 
--- 原始 HTTP 字段
-local ext = json['ext']
-local hasRawAccept = false
+    if k == 'url' then
+      ngx.var._url = v
+      hasRawUrl = true
+    elseif k == 'ver' then
+      ngx.var._ver = v
+    elseif k == 'type' then
+      ngx.var._type = v
+    elseif k == 'mode' then
+      ngx.var._mode = v
+    elseif k == 'aceh' then
+      ngx.ctx._acehOld = true
+    elseif k == 'level' then
+      ngx.var._level = v
+      ngx.ctx._level = tonumber(v)
+    end
+  else
+    ngx.req.set_header(k, v)
 
-for k, v in pairs(ext) do
-  if k == 'accept' then
-    hasRawAccept = true
-  elseif k == 'referer' then
-    ngx.var._ref = v
+    if k == 'referer' then
+      hasRawRefer = true
+      ngx.var._ref = v
+    end
   end
-  ngx.req.set_header(k, v)
 end
 
-if not hasRawAccept then
-  ngx.req.clear_header('accept')
+if not hasRawRefer then
+  ngx.req.clear_header('referer')
 end
 
--- 删除 URL 的 '/http/' 前缀
-ngx.var._url = ngx.var.request_uri:sub(7)
+if not hasRawUrl then
+  -- 删除 URL 的 '/http/' 前缀
+  ngx.var._url = ngx.var.request_uri:sub(7)
+end