@@ -42,6 +42,32 @@ function splitURIFragment(raw) {
4242 } ;
4343}
4444
45+ function parseWireGuardURIAddressValue ( value ) {
46+ if ( value == null ) return null ;
47+ const raw = `${ value } ` . trim ( ) ;
48+ if ( ! raw ) return null ;
49+ const [ , hostRaw = raw , cidrRaw ] = / ^ ( .* ?) (?: \/ ( \d + ) ) ? $ / . exec ( raw ) || [ ] ;
50+ const host = `${ hostRaw } ` . trim ( ) . replace ( / ^ \[ / , '' ) . replace ( / \] $ / , '' ) ;
51+ const normalizeCIDR = ( cidr , max ) => {
52+ if ( cidr == null ) return undefined ;
53+ if ( ! / ^ \d + $ / . test ( cidr ) ) return undefined ;
54+ const parsed = parseInt ( cidr , 10 ) ;
55+ if ( parsed < 0 || parsed > max ) return undefined ;
56+ return parsed ;
57+ } ;
58+ if ( isIPv4 ( host ) ) {
59+ return { family : 'ipv4' , address : host , cidr : normalizeCIDR ( cidrRaw , 32 ) } ;
60+ }
61+ if ( isIPv6 ( host ) ) {
62+ return {
63+ family : 'ipv6' ,
64+ address : host ,
65+ cidr : normalizeCIDR ( cidrRaw , 128 ) ,
66+ } ;
67+ }
68+ return null ;
69+ }
70+
4571function URI_PROXY ( ) {
4672 // socks5+tls
4773 // socks5
@@ -1420,7 +1446,16 @@ function URI_WireGuard() {
14201446 } ;
14211447 for ( const addon of addons . split ( '&' ) ) {
14221448 if ( addon ) {
1423- let [ key , value ] = addon . split ( '=' ) ;
1449+ const equalIndex = addon . indexOf ( '=' ) ;
1450+ let key ;
1451+ let value ;
1452+ if ( equalIndex === - 1 ) {
1453+ key = addon ;
1454+ value = '' ;
1455+ } else {
1456+ key = addon . slice ( 0 , equalIndex ) ;
1457+ value = addon . slice ( equalIndex + 1 ) ;
1458+ }
14241459 key = key . replace ( / _ / , '-' ) ;
14251460 value = decodeURIComponent ( value ) ;
14261461 if ( [ 'reserved' ] . includes ( key ) ) {
@@ -1433,15 +1468,18 @@ function URI_WireGuard() {
14331468 }
14341469 } else if ( [ 'address' , 'ip' ] . includes ( key ) ) {
14351470 value . split ( ',' ) . map ( ( i ) => {
1436- const ip = i
1437- . trim ( )
1438- . replace ( / \/ \d + $ / , '' )
1439- . replace ( / ^ \[ / , '' )
1440- . replace ( / \] $ / , '' ) ;
1441- if ( isIPv4 ( ip ) ) {
1442- proxy . ip = ip ;
1443- } else if ( isIPv6 ( ip ) ) {
1444- proxy . ipv6 = ip ;
1471+ const parsed = parseWireGuardURIAddressValue ( i ) ;
1472+ if ( ! parsed ) return ;
1473+ if ( parsed . family === 'ipv4' ) {
1474+ proxy . ip = parsed . address ;
1475+ if ( typeof parsed . cidr !== 'undefined' ) {
1476+ proxy [ 'ip-cidr' ] = parsed . cidr ;
1477+ }
1478+ } else if ( parsed . family === 'ipv6' ) {
1479+ proxy . ipv6 = parsed . address ;
1480+ if ( typeof parsed . cidr !== 'undefined' ) {
1481+ proxy [ 'ipv6-cidr' ] = parsed . cidr ;
1482+ }
14451483 }
14461484 } ) ;
14471485 } else if ( [ 'mtu' ] . includes ( key ) ) {
0 commit comments