Skip to content

Navigation Menu

Sign in
Sign up

Commit 6b69387

Browse files
更新代理接口
1 parent 3391d1d commit 6b69387

3 files changed

Lines changed: 86 additions & 69 deletions

File tree

‎api.conf‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ location = /error {
1515
more_set_headers
1616
'access-control-allow-origin: *'
1717
'access-control-expose-headers: gateway-err--'
18-
'gateway-err--: {"msg": "$arg_msg", "addr": "$upstream_addr"}'
18+
'gateway-err--: {"msg": "$arg_msg", "addr": "$upstream_addr", "url": "$arg_url"}'
1919
;
2020
return 204;
2121
}
@@ -34,7 +34,9 @@ location = /preflight {
3434

3535
# 该接口已作废
3636
location = /http {
37-
rewrite ^ /error?msg=API_OBSOLETED;
37+
access_log off;
38+
more_set_headers 'access-control-allow-origin: *';
39+
return 200 "当前站点已废弃,请访问新站点 https://jsproxy-demo.tk";
3840
}
3941

4042
# HTTP(S) Proxy

‎cf-worker/index.js‎

Lines changed: 46 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ const PREFLIGHT_INIT = {
1414
headers: new Headers({
1515
'access-control-allow-origin': '*',
1616
'access-control-allow-methods': 'GET,POST,PUT,PATCH,TRACE,DELETE,HEAD,OPTIONS',
17-
'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',
1817
'access-control-max-age': '1728000',
1918
}),
2019
}
@@ -55,11 +54,13 @@ async function fetchHandler(e) {
5554
})
5655
}
5756

58-
if (pathname.startsWith('/http')) {
59-
return httpHandler(req)
57+
if (pathname.startsWith('/http/')) {
58+
return httpHandler(req,pathname)
6059
}
6160

6261
switch (pathname) {
62+
case '/http':
63+
return makeRes('请更新 cfworker 到最新版本!')
6364
case '/ws':
6465
return makeRes('not support', 400)
6566
case '/works':
@@ -73,8 +74,9 @@ async function fetchHandler(e) {
7374

7475
/**
7576
* @param {Request} req
77+
* @param {string} pathname
7678
*/
77-
function httpHandler(req) {
79+
function httpHandler(req,pathname) {
7880
const reqHdrRaw = req.headers
7981
if (reqHdrRaw.has('x-jsproxy')) {
8082
return Response.error()
@@ -87,13 +89,7 @@ function httpHandler(req) {
8789
return new Response(null, PREFLIGHT_INIT)
8890
}
8991

90-
const urlStr = req.url.substr(6)
91-
try {
92-
var urlObj = new URL(urlStr)
93-
} catch (err) {
94-
return makeRes('invalid url: ' + urlStr, 403)
95-
}
96-
92+
let urlStr = ''
9793
let acehOld = false
9894
let rawSvr = ''
9995
let rawLen = ''
@@ -104,32 +100,51 @@ function httpHandler(req) {
104100

105101
// 此处逻辑和 http-dec-req-hdr.lua 大致相同
106102
// https://github.com/EtherDream/jsproxy/blob/master/lua/http-dec-req-hdr.lua
107-
const {sys, ext} = JSON.parse(reqHdrNew.get('accept'))
108-
109-
// 系统信息
110-
for (const [k, v] of Object.entries(sys)) {
111-
switch (k) {
112-
case 'aceh':
113-
acehOld = true
114-
break
115-
case 'raw-info':
116-
[rawSvr, rawLen, rawEtag] = v.split('|')
117-
break
103+
const refer = reqHdrNew.get('referer')
104+
const query = refer.substr(refer.indexOf('?') + 1)
105+
const param = new URLSearchParams(query)
106+
107+
for (const [k, v] of Object.entries(param)) {
108+
if (k.substr(0, 2) === '--') {
109+
// 系统信息
110+
switch (k.substr(2)) {
111+
case 'url':
112+
urlStr = v
113+
break
114+
case 'aceh':
115+
acehOld = true
116+
break
117+
case 'raw-info':
118+
[rawSvr, rawLen, rawEtag] = v.split('|')
119+
break
120+
}
121+
} else {
122+
// 还原 HTTP 请求头
123+
if (v) {
124+
reqHdrNew.set(k, v)
125+
} else {
126+
reqHdrNew.delete(k)
127+
}
118128
}
119129
}
130+
if (!param.has('referer')) {
131+
reqHdrNew.delete('referer')
132+
}
120133

121-
// 原始 HTTP 字段
122-
let hasRawAccept = false
134+
if (!urlStr) {
135+
urlStr = pathname.substr('/http/'.length)
136+
}
123137

124-
for (const [k, v] of Object.entries(ext)) {
125-
if (k === 'accept') {
126-
hasRawAccept = true
127-
}
128-
reqHdrNew.set(k, v)
138+
// cfworker 会把路径中的 `//` 合并成 `/`
139+
const m = urlStr.match(/^https?:(\/+)/)
140+
if (m && m[1] !== '//') {
141+
urlStr = urlStr.replace('/', '//')
129142
}
130143

131-
if (!hasRawAccept) {
132-
reqHdrNew.delete('accept')
144+
try {
145+
var urlObj = new URL(urlStr)
146+
} catch (err) {
147+
return makeRes('invalid url: ' + urlStr, 403)
133148
}
134149

135150
/** @type {RequestInit} */

‎lua/http-dec-req-hdr.lua‎

Lines changed: 36 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,47 @@
11
-- 还原 HTTP 请求头
2-
-- 前端只保留简单字段(防止出现 preflight),
3-
-- 其余字段及系统信息,存储在 Accept 字段里(JSON 格式)。
2+
localhasRawUrl=false
3+
localhasRawRefer=false
44

5-
local cjson = require('cjson')
6-
local hdrs, err = ngx.req.get_headers()
7-
ngx.log(ngx.ALERT, 'accept:' .. hdrs['accept'])
8-
local info = ngx.unescape_uri(hdrs['accept'])
9-
local json = cjson.decode(info)
5+
local hdrs = ngx.req.get_headers()
6+
local refer = hdrs['referer']
7+
local query = refer:sub(refer:find('?', 10, true) + 1)
8+
local param = ngx.decode_args(query)
109

11-
-- 系统信息
12-
local sys = json['sys']
1310

14-
for k, v in pairs(sys) do
15-
if k == 'ver' then
16-
ngx.var._ver = v
17-
elseif k == 'type' then
18-
ngx.var._type = v
19-
elseif k == 'mode' then
20-
ngx.var._mode = v
21-
elseif k == 'aceh' then
22-
ngx.ctx._acehOld = true
23-
elseif k == 'level' then
24-
ngx.var._level = v
25-
ngx.ctx._level = tonumber(v)
26-
end
27-
end
11+
for k, v in pairs(param) do
12+
if k:sub(1, 2) == '--' then
13+
k = k:sub(3)
2814

29-
-- 原始 HTTP 字段
30-
local ext = json['ext']
31-
local hasRawAccept = false
15+
if k == 'url' then
16+
ngx.var._url = v
17+
hasRawUrl = true
18+
elseif k == 'ver' then
19+
ngx.var._ver = v
20+
elseif k == 'type' then
21+
ngx.var._type = v
22+
elseif k == 'mode' then
23+
ngx.var._mode = v
24+
elseif k == 'aceh' then
25+
ngx.ctx._acehOld = true
26+
elseif k == 'level' then
27+
ngx.var._level = v
28+
ngx.ctx._level = tonumber(v)
29+
end
30+
else
31+
ngx.req.set_header(k, v)
3232

33-
for k, v in pairs(ext) do
34-
if k == 'accept' then
35-
hasRawAccept = true
36-
elseif k == 'referer' then
37-
ngx.var._ref = v
33+
if k == 'referer' then
34+
hasRawRefer = true
35+
ngx.var._ref = v
36+
end
3837
end
39-
ngx.req.set_header(k, v)
4038
end
4139

42-
if not hasRawAccept then
43-
ngx.req.clear_header('accept')
40+
if not hasRawRefer then
41+
ngx.req.clear_header('referer')
4442
end
4543

46-
-- 删除 URL 的 '/http/' 前缀
47-
ngx.var._url = ngx.var.request_uri:sub(7)
44+
if not hasRawUrl then
45+
-- 删除 URL 的 '/http/' 前缀
46+
ngx.var._url = ngx.var.request_uri:sub(7)
47+
end

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /