IE11 compatible & bug fix

This commit is contained in:
wits-fe 2023-04-27 16:10:13 +08:00
parent 659711aa0d
commit b42f8e2ca5

68
code.js
View File

@ -19,45 +19,43 @@ function binarySearch(list, num, lower, upper) {
return x; return x;
} }
function fixLength(text) { function convertToInt6(high, low) {
if (text.length == 1) return "000" + text; var num1 = parseInt(high, 16) & 0xFFFF;
if (text.length == 2) return "00" + text; var num2 = parseInt(low, 16) & 0xFFFF;
if (text.length == 3) return "0" + text; return (((num1 << 16) | num2) >>> 0);
return text;
}
function convertToInt(high, low) {
if (low.length != 4)
return parseInt(high + fixLength(low), 16);
return parseInt(high + low, 16);
} }
function isInNet6(parts, list, list2) { function isInNet6(parts, list, list2) {
var num = convertToInt(parts[0], parts[1]); var num = convertToInt6(parts[0], parts[1]);
var x = binarySearch(list, num, 0, list.length); var x = binarySearch(list, num, 0, list.length);
if (list[x][1] == -1) if (list[x][1] == -1)
return ((num & list[x][2]) === list[x][0]); return (((num & list[x][2]) ^ list[x][0]) === 0);
// not in net (/33 - /64) // not in net (/33 - /64)
if (num !== list[x][0]) if (num !== list[x][0])
return false; return false;
var num2 = convertToInt(parts[2], parts[3]); var num2 = convertToInt6(parts[2], parts[3]);
var x2 = binarySearch(list2, num2, list[x][1], list[x][2] + 1); var x2 = binarySearch(list2, num2, list[x][1], list[x][2] + 1);
return ((num2 & list2[x2][1]) === list2[x2][0]); return (((num2 & list2[x2][1]) ^ list2[x2][0]) === 0);
} }
function isLanOrChina6(host) { function isLanOrChina6(host) {
if (host.indexOf("::") === -1) { var addr = host;
var groups = host.split(":"); if (addr.indexOf("[") !== -1) {
addr = addr.substring(1, addr.length - 1);
}
if (addr.indexOf("::") === -1) {
var groups = addr.split(":");
if (groups.length != 8) if (groups.length != 8)
return false; // invalid ipv6 format return false; // invalid ipv6 format
return isInNet6(groups, CHINA6_F, CHINA6_S) || isInNet6(groups, LAN6_F, LAN6_S); return isInNet6(groups, CHINA6_F, CHINA6_S) || isInNet6(groups, LAN6_F, LAN6_S);
} }
var halfs = host.split("::"); var halfs = addr.split("::");
var left = halfs[0]; var left = halfs[0];
var right = halfs[1]; var right = halfs[1];
if (left.length < 1) left = "0000"; if (left.length < 1) left = "0000";
@ -93,8 +91,14 @@ function isLanOrChina6(host) {
return isInNet6(parts, CHINA6_F, CHINA6_S) || isInNet6(parts, LAN6_F, LAN6_S); return isInNet6(parts, CHINA6_F, CHINA6_S) || isInNet6(parts, LAN6_F, LAN6_S);
} }
function convertToInt(host) {
var bytes = host.split(".");
var result = ((bytes[0] & 0xFF) << 24) | ((bytes[1] & 0xFF) << 16) | ((bytes[2] & 0xFF) << 8) | (bytes[3] & 0xFF);
return (result >>> 0);
}
function belongsToSubnet(host, list) { function belongsToSubnet(host, list) {
var ip = convert_addr(host) >>> 0; var ip = convertToInt(host);
if (list.length === 0 || ip < list[0][0]) if (list.length === 0 || ip < list[0][0])
return false; return false;
@ -171,7 +175,7 @@ function FindProxyForURL(url, host) {
} }
// Fallback to IP whitelist // Fallback to IP whitelist
// if host is IPv6 // if host is IPv6
if (host.indexOf(":") !== -1) { if (host.indexOf(":") !== -1) {
if (isLanOrChina6(host)) { if (isLanOrChina6(host)) {
@ -179,26 +183,26 @@ function FindProxyForURL(url, host) {
} }
return proxy; return proxy;
} }
// default resolve IPv4
// var remote = dnsResolve(host);
// if (!remote) {
// // resolution failed
// return proxy;
// }
// method for IPv6 // method for IPv6
var ips = dnsResolveEx(host); var remote = dnsResolveEx(host);
if (!ips) if (!remote) {
return proxy; // fallback to legacy method
var remote = ips.split(";")[0]; remote = dnsResolve(host);
if (!remote)
return proxy;
}
else {
remote = remote.split(";")[0];
}
if (remote.indexOf(":") !== -1) { if (remote.indexOf(":") !== -1) {
if (isLanOrChina6(remote)) { if (isLanOrChina6(remote)) {
return direct; return direct;
} }
return proxy; return proxy;
} }
if (isLan(remote) || isChina(remote)) { if (isLan(remote) || isChina(remote)) {
return direct; return direct;
} }