@@ -49,13 +49,14 @@ export default {
4949 const kvCheckResponse = await check_kv ( env ) ;
5050 let kvData = { } ;
5151 if ( ! kvCheckResponse ) {
52- const kvData = await get_kv ( env ) || { } ;
53- log ( `[fetch]--> kv_id = ${ kvData . kv_id } , kv_pDomain = ${ kvData . kv_pDomain } , kv_p64Domain = ${ kvData . kv_p64Domain } ` ) ;
52+ kvData = await get_kv ( env ) || { } ;
53+ log ( `[fetch]--> kv_id = ${ kvData . kv_id } , kv_pDomain = ${ JSON . stringify ( kvData . pDomain ) } , kv_p64Domain = ${ JSON . stringify ( kvData . kv_p64Domain ) } ` ) ;
5454 }
5555
5656 const url = new URL ( request . url ) ;
5757 enableLog = url . searchParams . get ( 'ENABLE_LOG' ) || ENABLE_LOG || enableLog ;
5858 id = ( kvData . kv_id || ID || id ) . toLowerCase ( ) ;
59+ log ( `[fetch]--> id = ${ id } ` ) ;
5960
6061 paddr = url . searchParams . get ( 'PADDR' ) || PADDR || paddr ;
6162 if ( paddr ) {
@@ -64,10 +65,12 @@ export default {
6465 pnum = port || pnum ;
6566 }
6667 pDomain = kvData . kv_pDomain || pDomain ;
68+ log ( `[fetch]--> pDomain = ${ JSON . stringify ( pDomain ) } ` ) ;
6769
6870 p64 = url . searchParams . get ( 'P64' ) || P64 || p64 ;
6971 p64Prefix = url . searchParams . get ( 'P64PREFIX' ) || P64PREFIX || p64Prefix ;
7072 p64Domain = kvData . kv_p64Domain || p64Domain ;
73+ log ( `[fetch]--> p64Domain = ${ JSON . stringify ( p64Domain ) } ` ) ;
7174
7275 s5 = url . searchParams . get ( 'S5' ) || S5 || s5 ;
7376 parsedS5 = await requestParserFromUrl ( s5 , url ) ;
@@ -237,31 +240,83 @@ function xorDe(b64, key) {
237240 return decoder . decode ( out ) ;
238241}
239242
240- async function getDomainToRouteX ( addressRemote , portRemote , s5Enable , p64Flag = false ) {
241- log ( `[getDomainToRouteX]--> paddr = ${ paddr } , p64Prefix = ${ p64Prefix } , addressRemote = ${ addressRemote } , p64 = ${ p64 } ` ) ;
243+ async function getDomainToRouteX ( addressRemote , portRemote , s5Enable , p64Flag = false , pDomain , p64Domain ) {
242244 let finalTargetHost = addressRemote ;
243245 let finalTargetPort = portRemote ;
244- if ( s5Enable ) {
245- finalTargetHost = addressRemote ;
246- finalTargetPort = portRemote ;
247- } else if ( pDomain . some ( domain => matchesDomainPattern ( addressRemote , domain ) ) ) {
248- finalTargetHost = paddr ;
249- finalTargetPort = pnum || portRemote ;
250- } else if ( p64Domain . some ( domain => matchesDomainPattern ( addressRemote , domain ) ) || ( p64Flag && p64 ) ) {
251- try {
252- finalTargetHost = await resolveDomainToRouteX ( addressRemote ) ;
246+ try {
247+ log ( `[getDomainToRouteX]--> paddr=${ paddr } , p64Prefix=${ p64Prefix } , addressRemote=${ addressRemote } , p64=${ p64 } ` ) ;
248+ log ( `[getDomainToRouteX]--> pDomain=${ JSON . stringify ( pDomain ) } , p64Domain=${ JSON . stringify ( p64Domain ) } ` ) ;
249+
250+ const safeMatch = ( domains , target ) => {
251+ try {
252+ return Array . isArray ( domains ) && domains . some ( domain => matchesDomainPattern ( target , domain ) ) ;
253+ } catch ( e ) {
254+ log ( `[error]--> matchesDomainPattern failed: ${ e . message } ` ) ;
255+ return false ;
256+ }
257+ } ;
258+
259+ const resultDomain = safeMatch ( pDomain , addressRemote ) ;
260+ const result64Domain = safeMatch ( p64Domain , addressRemote ) ;
261+ log ( `[getDomainToRouteX]--> match pDomain=${ resultDomain } , match p64Domain=${ result64Domain } , p64Flag=${ p64Flag } ` ) ;
262+
263+ if ( s5Enable ) {
264+ log ( `[getDomainToRouteX]--> s5Enable=true, use remote directly` ) ;
265+ } else if ( resultDomain ) {
266+ finalTargetHost = paddr ;
267+ finalTargetPort = pnum || portRemote ;
268+ log ( `[getDomainToRouteX]--> Matched pDomain, use paddr=${ finalTargetHost } , port=${ finalTargetPort } ` ) ;
269+ } else if ( result64Domain || ( p64Flag && p64 ) ) {
270+ try {
271+ finalTargetHost = await resolveDomainToRouteX ( addressRemote ) ;
272+ finalTargetPort = portRemote ;
273+ log ( `[getDomainToRouteX]--> Resolved p64Domain via resolveDomainToRouteX: ${ finalTargetHost } ` ) ;
274+ } catch ( err ) {
275+ log ( `[retry]--> resolveDomainToRouteX failed: ${ err . message } ` ) ;
276+ finalTargetHost = paddr || addressRemote ;
277+ finalTargetPort = pnum || portRemote ;
278+ }
279+ } else if ( p64Flag ) {
280+ finalTargetHost = paddr || addressRemote ;
253281 finalTargetPort = portRemote ;
254- } catch ( err ) {
255- log ( `[retry]--> resolveDomainToRouteX failed: ${ err . message } ` ) ;
282+ log ( `[getDomainToRouteX]--> fallback by p64Flag, host=${ finalTargetHost } , port=${ finalTargetPort } ` ) ;
283+ }
284+
285+ log ( `[getDomainToRouteX]--> Final target: ${ finalTargetHost } :${ finalTargetPort } ` ) ;
286+ return { finalTargetHost, finalTargetPort } ;
287+ } catch ( err ) {
288+ log ( `[fatal]--> getDomainToRouteX failed: ${ err . message } ` ) ;
289+ if ( p64Flag ) {
256290 finalTargetHost = paddr || addressRemote ;
257- finalTargetPort = pnum || portRemote ;
291+ finalTargetPort = portRemote ;
292+ log ( `[fatal-fallback]--> fallback by p64Flag, host=${ finalTargetHost } , port=${ finalTargetPort } ` ) ;
258293 }
259- } else if ( p64Flag ) {
260- finalTargetHost = paddr || addressRemote ;
261- finalTargetPort = portRemote ;
294+ return { finalTargetHost, finalTargetPort } ;
262295 }
263- log ( `[getDomainToRouteX]--> Using finalTargetHost: ${ finalTargetHost } , finalTargetPort: ${ finalTargetPort } ` ) ;
264- return { finalTargetHost, finalTargetPort } ;
296+ }
297+
298+ function matchesDomainPattern ( hostname , pattern ) {
299+ if ( ! hostname || ! pattern ) return false ;
300+
301+ hostname = hostname . toLowerCase ( ) ;
302+ pattern = pattern . toLowerCase ( ) ;
303+ const ipv4Regex = / ^ ( \d { 1 , 3 } \. ) { 3 } \d { 1 , 3 } $ / ;
304+ const ipv6Regex = / ^ \[ ? ( [ a - f 0 - 9 : ] + ) \] ? $ / i;
305+ if ( ipv4Regex . test ( hostname ) || ipv6Regex . test ( hostname ) ) {
306+ return false ;
307+ }
308+
309+ const hostParts = hostname . split ( '.' ) ;
310+ const patternParts = pattern . split ( '.' ) ;
311+
312+ if ( hostParts . length < patternParts . length ) return false ;
313+
314+ for ( let i = 1 ; i <= patternParts . length ; i ++ ) {
315+ if ( hostParts [ hostParts . length - i ] !== patternParts [ patternParts . length - i ] ) {
316+ return false ;
317+ }
318+ }
319+ return true ;
265320}
266321
267322async function resolveDomainToRouteX ( domain ) {
@@ -1702,4 +1757,3 @@ function renderPage({ base64Title, suffix = '', heading, bodyContent }) {
17021757 </body>
17031758 </html>` ;
17041759}
1705-
0 commit comments