update proxy

This commit is contained in:
unknown
2025-09-19 19:42:16 +08:00
parent dcf346dcc9
commit 40e0b37a9a

View File

@ -422,6 +422,10 @@ class WindowService {
async refreshSession(args, event) {
const { platform, partitionId } = args;
const view = app.viewsMap.get(partitionId);
// 声明代理配置错误变量,确保作用域正确
let configError = null;
if (view && !view.webContents.isDestroyed()) {
try {
// 获取会话信息
@ -451,9 +455,19 @@ class WindowService {
// 等待一下确保清除操作完成
await new Promise(resolve => setTimeout(resolve, 500));
// 重新加载代理配置
await this._loadConfig(view, partitionId, sessionObj.platform);
logger.info(`[${partitionId}] 代理配置重新加载完成`);
// 重新加载代理配置 - 允许失败但记录错误
try {
await this._loadConfig(view, partitionId, sessionObj.platform);
logger.info(`[${partitionId}] ✅ 代理配置重新加载完成`);
} catch (error) {
configError = error;
logger.error(`[${partitionId}] ❌ 代理配置加载失败:`, error);
logger.error(`[${partitionId}] 错误信息: ${error.message}`);
logger.warn(`[${partitionId}] ⚠️ 代理配置失败,但仍将刷新页面以确保退出局部代理状态`);
// 关键修复:即使全局代理配置无效,也要强制使用全局代理而不是系统代理
await this._forceApplyInvalidGlobalProxy(view, partitionId);
}
// 再等待一下确保代理配置完全生效
await new Promise(resolve => setTimeout(resolve, 1000));
@ -500,67 +514,27 @@ class WindowService {
// 等待页面加载完成
await reloadPromise;
} catch (error) {
logger.error(`[${partitionId}] 刷新会话时重新加载代理配置失败:`, error);
logger.warn(`[${partitionId}] 代理配置失败,但仍然继续刷新会话`);
logger.warn(`[${partitionId}] 错误信息: ${error.message}`);
// 即使代理配置失败,也继续刷新页面(用户可能故意设置错误的代理)
try {
const currentURL = view.webContents.getURL();
logger.info(`[${partitionId}] 准备刷新页面忽略代理错误当前URL: ${currentURL}`);
// 添加页面加载事件监听器来确认刷新是否成功
const reloadPromise = new Promise((resolve) => {
const onDidFinishLoad = () => {
logger.info(`[${partitionId}] 页面刷新完成(忽略代理配置错误) - did-finish-load 事件触发`);
view.webContents.removeListener('did-finish-load', onDidFinishLoad);
resolve();
};
view.webContents.once('did-finish-load', onDidFinishLoad);
// 设置超时,防止无限等待
setTimeout(() => {
view.webContents.removeListener('did-finish-load', onDidFinishLoad);
logger.warn(`[${partitionId}] 页面刷新超时(忽略代理错误),可能刷新失败`);
resolve();
}, 10000); // 10秒超时
});
// 如果当前URL为空重新加载原始URL否则使用reload()
if (!currentURL || currentURL === 'about:blank') {
logger.info(`[${partitionId}] 当前URL为空忽略代理错误重新加载原始URL`);
// 获取会话信息来确定平台
const sessionObj = await app.sdb.selectOne("session_list", {
partitionId: partitionId,
});
if (sessionObj) {
const platformConfig = app.platforms.find(p => p.platform === sessionObj.platform);
if (platformConfig) {
logger.info(`[${partitionId}] 加载${sessionObj.platform}页面: ${platformConfig.url}(忽略代理错误)`);
await view.webContents.loadURL(platformConfig.url);
} else {
logger.error(`[${partitionId}] 未找到${sessionObj.platform}平台配置(忽略代理错误)`);
view.webContents.reload();
}
} else {
logger.error(`[${partitionId}] 未找到会话信息(忽略代理错误)`);
view.webContents.reload();
}
} else {
view.webContents.reload();
logger.info(`[${partitionId}] reload() 方法已调用(忽略代理错误)`);
}
// 等待页面加载完成
await reloadPromise;
} catch (reloadError) {
logger.error(`[${partitionId}] 页面刷新失败:`, reloadError);
// 检查是否有代理配置错误,如果有则返回警告信息
if (configError) {
logger.warn(`[${partitionId}] ⚠️ 页面已刷新,但代理配置存在问题`);
return {
status: false,
message: `页面刷新失败:${reloadError.message}`
status: true,
message: `页面刷新,但代理配置失败:${configError.message}`,
warning: true
};
}
logger.info(`[${partitionId}] ✅ 会话刷新完成`);
} catch (error) {
logger.error(`[${partitionId}] 刷新会话时发生未预期错误:`, error);
logger.error(`[${partitionId}] 错误信息: ${error.message}`);
// 页面刷新相关的错误也直接返回失败
return {
status: false,
message: `刷新会话失败:${error.message}`
};
}
}
return { status: true, message: "刷新成功" };
@ -1567,15 +1541,24 @@ class WindowService {
});
if (!sessionObj) continue;
// 重新加载代理配置
await this._loadConfig(view, partitionId, sessionObj.platform);
logger.info(
`Successfully updated proxy settings for session ${partitionId}`
);
try {
// 重新加载代理配置
await this._loadConfig(view, partitionId, sessionObj.platform);
// 代理配置更改后必须重新加载页面
logger.info(`[${partitionId}] 代理配置已更新,重新加载页面`);
view.webContents.reload();
logger.info(`[${partitionId}] ✅ 代理设置更新完成并重新加载页面`);
} catch (configError) {
// 如果代理配置失败,记录错误但不继续处理该会话
logger.error(`[${partitionId}] 代理配置失败:`, configError.message);
logger.error(`[${partitionId}] 该会话将保持当前状态,不进行页面重新加载`);
}
}
return true;
} catch (error) {
logger.error("Failed to apply proxy settings:", error);
logger.error("应用代理设置失败:", error);
return false;
}
}
@ -1817,6 +1800,101 @@ class WindowService {
};
}
}
/**
* 强制应用无效的全局代理配置
* 当全局代理开启但配置无效时,仍然要使用该无效配置而不是回退到系统代理
*/
async _forceApplyInvalidGlobalProxy(view, partitionId) {
try {
logger.warn(`[${partitionId}] 🔥 强制应用无效的全局代理配置`);
// 获取全局代理配置(即使无效)
const globalConfig = await app.sdb.selectOne("global_proxy_config");
if (globalConfig && globalConfig.proxyStatus === "true") {
// 即使IP或端口为空也要强制设置代理
const proxyIp = globalConfig.proxyIp || "invalid.proxy.ip";
const proxyPort = globalConfig.proxyPort || "0";
logger.error(`[${partitionId}] 🔥 强制使用无效全局代理: ${proxyIp}:${proxyPort}`);
logger.error(`[${partitionId}] 🔥 这将导致网络请求失败,但符合严格模式要求`);
// 构建代理配置
const proxyConfig = {
mode: 'fixed_servers',
rules: {
singleProxy: {
scheme: globalConfig.proxyType || 'http',
host: proxyIp,
port: parseInt(proxyPort) || 0
}
}
};
// 强制设置无效代理 - 确保代理配置生效
await view.webContents.session.setProxy(proxyConfig);
// 如果有认证信息,设置代理认证监听器
if (globalConfig.userVerifyStatus === "true" && globalConfig.username && globalConfig.password) {
logger.info(`[${partitionId}] 🔥 设置无效代理的认证监听器`);
// 移除旧的认证监听器
view.webContents.session.removeAllListeners('login');
// 添加代理认证监听器
view.webContents.session.on('login', (event, request, authInfo, callback) => {
if (authInfo.isProxy) {
logger.info(`[${partitionId}] 🔥 代理认证请求: ${authInfo.host}:${authInfo.port}`);
event.preventDefault();
callback(globalConfig.username, globalConfig.password);
}
});
}
// 验证代理设置是否真正生效
const currentProxy = await view.webContents.session.resolveProxy('https://www.google.com');
logger.error(`[${partitionId}] 🔥 当前代理解析结果: ${currentProxy}`);
// 由于Electron代理设置可能不可靠使用webRequest API强制阻止所有网络请求
logger.error(`[${partitionId}] 🔥 使用webRequest API强制阻止所有网络请求`);
// 移除所有现有的请求拦截器
view.webContents.session.webRequest.onBeforeRequest(null);
view.webContents.session.webRequest.onBeforeSendHeaders(null);
// 添加强制阻止所有网络请求的拦截器
view.webContents.session.webRequest.onBeforeRequest((details, callback) => {
// 允许本地资源和应用内部资源
if (details.url.startsWith('file://') ||
details.url.startsWith('chrome-extension://') ||
details.url.startsWith('devtools://') ||
details.url.includes('localhost') ||
details.url.includes('127.0.0.1')) {
callback({ cancel: false });
return;
}
// 阻止所有其他网络请求
logger.error(`[${partitionId}] 🔥 阻止网络请求: ${details.url}`);
logger.error(`[${partitionId}] 🔥 原因: 全局代理配置无效,严格模式不允许网络访问`);
callback({ cancel: true });
});
logger.error(`[${partitionId}] 🔥 已设置网络请求拦截器,所有外部网络请求将被阻止`);
logger.error(`[${partitionId}] 🔥 无效全局代理已强制应用,页面将无法正常访问`);
logger.error(`[${partitionId}] 🔥 这是严格模式的预期行为:不允许回退到系统代理`);
} else {
logger.error(`[${partitionId}] 🔥 全局代理未开启,但代理配置仍然失败,这是异常情况`);
}
} catch (error) {
logger.error(`[${partitionId}] 🔥 强制应用无效全局代理时发生错误:`, error);
// 即使设置失败,也不要回退到系统代理
}
}
}
WindowService.toString = () => "[class WindowService]";