如何在Electron中通过session.setProxy()配置proxy.pac代理
问题:Electron应用配置PAC代理未生效
问题背景
现有如下proxy.pac文件,期望Electron应用加载指定serverUrl时通过该代理访问,且代理的access.log能记录对应请求:
function FindProxyForURL(url, host) { return 'PROXY http://{some_ip_host}:3128'; }
尝试的代码
参考相关示例编写的main.js代码:
// some imports and code before function createWindow() { let loading = new BrowserWindow() loading.once('show', () => { mainWindow = new BrowserWindow({ width: 1450, height: 900, webPreferences: { nodeIntegration: true, enableRemoteModule: true, contextIsolation: false, preload: `${__dirname}/logic.js` }, show: false }) let content = `function FindProxyForURL(url, host) { return 'PROXY http://{some_ip_host}:3128'; }`; const ses = mainWindow.webContents.session; ses.closeAllConnections(); ses.setProxy({ mode:'pac_script', pacScript: 'data:application/x-ns-proxy-autoconfig;base64,' + Buffer.from(content, 'utf8').toString('base64') }).then(_=>{ console.log('done'); }); // 此处期望返回PROXY,但实际仅返回DIRECT(是否正常?) ses.resolveProxy("https://www.google.com").then(r => { console.log("resolved proxy: " + r) }).catch(r => { console.log(r) }); // here some code mainWindow.loadURL(serverUrl).then(() => { console.log("loaded url successfully") }).catch(r => { console.log(r) }); }) } app.whenReady().then(() => { createWindow() })
错误现象
启动应用后日志输出如下,且代理无请求记录:
done resolved proxy: DIRECT loaded url successfully
解决方法
核心问题是异步操作的时机错误:setProxy是异步方法,你在它的回调外部直接执行resolveProxy和loadURL,此时代理配置还未生效,默认使用DIRECT连接。需将所有依赖代理的逻辑放到setProxy的完成回调内。
修改后的代码示例:
// some imports and code before function createWindow() { let loading = new BrowserWindow() loading.once('show', () => { mainWindow = new BrowserWindow({ width: 1450, height: 900, webPreferences: { nodeIntegration: true, enableRemoteModule: true, contextIsolation: false, preload: `${__dirname}/logic.js` }, show: false }) let content = `function FindProxyForURL(url, host) { return 'PROXY http://{some_ip_host}:3128'; }`; const ses = mainWindow.webContents.session; ses.closeAllConnections(); // 将代理解析、URL加载逻辑放到setProxy完成回调内 ses.setProxy({ mode:'pac_script', pacScript: 'data:application/x-ns-proxy-autoconfig;base64,' + Buffer.from(content, 'utf8').toString('base64') }).then(_=>{ console.log('done'); // 此时代理配置已生效,能正确解析代理地址 ses.resolveProxy("https://www.google.com").then(r => { console.log("resolved proxy: " + r) }).catch(r => { console.log(r) }); // 等待代理配置完成后再加载目标URL mainWindow.loadURL(serverUrl).then(() => { console.log("loaded url successfully") }).catch(r => { console.log(r) }); }); // here some code }) } app.whenReady().then(() => { createWindow() })
修改后,setProxy执行完成后才会处理代理解析和URL加载,此时PAC配置已生效,resolveProxy会返回正确的PROXY地址,代理日志也能捕获到Electron的请求记录。
内容的提问来源于stack exchange,提问作者Joe Koteyko
相关产品推荐
相关产品推荐

