Update server.js via upload script - 2026-08-01 16:58:15

This commit is contained in:
mike 2026-08-01 16:58:38 +08:00
parent 090774f86d
commit 390e8744d7
1 changed files with 23 additions and 7 deletions

View File

@ -160,11 +160,21 @@ function tcpCheck(host, port, timeoutMs = 6000) {
// 1) Cloudflare的520/521/522/523/524是"源站不可达"专属状态码能连上CDN但源站挂了会明确返回这几个码
// 2) 再做一次真正的WebSocket握手直接对应Xray/sing-box监听WS的那一层比单看状态码更准。
// 两个都过才算正常。
function httpStatusCheck(host, wsPath, timeoutMs = 8000) {
// 注意连接必须用line.addr真实服务器/CDN边缘地址+ line.port真实端口不能写死443
// 很多自建线路会用非标准端口但HTTP Host头和TLS SNI要用line.host/line.sni伪装域名
// 不能也用addr——如果源站是按Host头路由的Nginx server_name/反代规则Host发错了根本到不了
// 正确的源站,会拿到无关响应甚至连接失败,跟真实客户端的连接行为对不上。
function httpStatusCheck(line, timeoutMs = 8000) {
return new Promise((resolve) => {
const routeName = line.host || line.sni || line.addr;
const req = https.request({
hostname: host, port: 443, path: wsPath || '/', method: 'GET', timeout: timeoutMs,
headers: { 'User-Agent': 'Mozilla/5.0' },
hostname: line.addr,
port: Number(line.port) || 443,
path: line.ws_path || '/',
method: 'GET',
timeout: timeoutMs,
servername: line.sni || routeName, // TLS SNI
headers: { 'User-Agent': 'Mozilla/5.0', Host: routeName },
}, (res) => {
res.resume();
const badGateway = [520, 521, 522, 523, 524].includes(res.statusCode);
@ -175,7 +185,7 @@ function httpStatusCheck(host, wsPath, timeoutMs = 8000) {
req.end();
});
}
function wsHandshakeCheck(host, wsPath, timeoutMs = 8000) {
function wsHandshakeCheck(line, timeoutMs = 8000) {
return new Promise((resolve) => {
let done = false;
let ws;
@ -186,7 +196,13 @@ function wsHandshakeCheck(host, wsPath, timeoutMs = 8000) {
resolve(ok);
};
try {
ws = new WebSocket(`wss://${host}${wsPath || '/'}`, { handshakeTimeout: timeoutMs });
const port = Number(line.port) || 443;
const routeName = line.host || line.sni || line.addr;
ws = new WebSocket(`wss://${line.addr}:${port}${line.ws_path || '/'}`, {
handshakeTimeout: timeoutMs,
headers: { Host: routeName },
servername: line.sni || routeName, // TLS SNI
});
ws.on('open', () => finish(true));
ws.on('unexpected-response', () => finish(false));
ws.on('error', () => finish(false));
@ -200,8 +216,8 @@ function wsHandshakeCheck(host, wsPath, timeoutMs = 8000) {
async function checkLineConnectivity(line) {
if (line.protocol === 'vless-cdn') {
const [httpOk, wsOk] = await Promise.all([
httpStatusCheck(line.addr, line.ws_path),
wsHandshakeCheck(line.addr, line.ws_path),
httpStatusCheck(line),
wsHandshakeCheck(line),
]);
return httpOk && wsOk;
}