Мне нужно установить соединение WebSocket через PAC URL-прокси из приложения Electron, с сервера, который не принимает запросы извне (TCP или HTTP (S)), из-за повышенной безопасности и брандмауэра. Единственное приемлемое решение - это запрос HTTPS (порт 443) с определенным прокси-сервером PAC URL . Я должен читать данные через TCP внутри системы и отправлять их через веб-сокет HTTPS.
Я решил использовать ElectronJS с пакетами NodejS, и все работает до того момента, когда мне нужно подключиться к внешнему серверу WebSocket. Я попытался сделать следующее*, но только в командной строке Chrome. Приложение выбрасывает время ожидания подключения, так как кажется, что оно не использует те же настройки WebSocket, что и Chrome
const { app, BrowserWindow} = require('electron')
app.commandLine.appendSwitch('proxy-pac-url', 'http://someURL.com:9001/proxy.pac')
var wsUri = "wss://echo.websocket.org/";
var websocket = new WebSocket(wsUri); //works in Chrome, not in the code
- Пример веб-сокета из https-proxy-agent Сбой с ошибкой, содержащей объект неожиданный (не содержит логических причин)
this.proxyHost = 'http://someURL.com:9001/proxy.pac'
log.info('Is client ' + this.name + ' already connected: ' + this.isConnected)
if (!this.isConnected) {
let wsEndpoint = `ws://${this.host}:${this.port}?auth=${this.auth}`
if (this.port == '443') {
wsEndpoint = `wss://${this.host}:${this.port}?auth=${this.auth}`
}
if (this.proxyHost) {
const options = url.parse(this.proxyHost)
const agent = new HttpsProxyAgent(options)
this.socket = new WebSocket(wsEndpoint, '', { agent: agent })
log.info('Connecting client ' + wsEndpoint + ' via proxy: ' + this.proxyHost)
} else {
this.socket = new WebSocket(wsEndpoint)
log.info('Connecting client ' + wsEndpoint)
}
return true
}
return false
- В качестве последнего варианта я попытался использовать встроенную функцию сеанса
ses.setProxy(config, callback)
найдено по по этой ссылке (см. Код ниже). Я не получаю никаких ошибок, но все равно получаю тайм-аут
this.proxyHost = 'http://someURL.com:9001/proxy.pac'
const { app, BrowserWindow} = require('electron')
var wsUri = "wss://echo.websocket.org/";
var win = new BrowserWindow({//some settings})
win.webContents.session.setProxy(this.proxyHost, function (e) {
log.info(e);
log.info('Odlicno')
return true
})
Я не понимаю, как это возможно, что все работает через командную строку, но не работает через приложениекод. Я уверен, что использую один и тот же код как в приложении, так и в консоли Chrome