@@ -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 ( / ^ h t t p s ? : ( \/ + ) / )
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 } */
0 commit comments