Я хочу смоделировать websockets, используя HTTP_PROXY
на моем docker
контейнере с docker-compose
. Обычные запросы HTTP
и HTTPS
работают и получают прокси, как и ожидалось, но событие обновления для веб-сокетов не вызывается в моем прокси.
Соответствующий код из моего app
контейнера для проверки веб-сокетов
const WebSocket = require('ws');
const ws = new WebSocket('ws://echo.websocket.org/', {
origin: 'http://websocket.org'
});
ws.on('open', function open() {
console.log('connected');
ws.send(Date.now());
});
ws.on('close', function close() {
console.log('disconnected');
});
ws.on('message', function incoming(data) {
console.log(data)
console.log(`Roundtrip time: ${Date.now() - data} ms`);
setTimeout(function timeout() {
ws.send(Date.now());
}, 500);
});
Для прокси сетевого трафика websocket я определил следующую переменную среды в контейнере
environment:
NODE_TLS_REJECT_UNAUTHORIZED: 0
HTTP_PROXY: http://proxy:8000
HTTPS_PROXY: http://proxy:8001
NO_PROXY: localhost,127.0.0.1
Тогда, если я позвоню на обычный HTTP
запрос типа
axios.get('http://example.org')
Он отлично проксируется в моем proxy
контейнере, где код выглядит так:
const http = require('http')
const https = require('https')
const httpProxy = require('http-proxy')
const pem = require('pem')
pem.createCertificate({ days: 1, selfSigned: true }, (certErr, keys) => {
if (certErr) {
throw certErr
}
const httpsOptions = {
key: keys.serviceKey,
cert: keys.certificate,
}
const proxy = httpProxy.createServer({
ssl: httpsOptions,
ws: true,
secure: false,
})
const secureServer = https.createServer(httpsOptions, (req, res) => {
console.log('here here http secure', req.url)
proxy.web(req, res, { target: 'http://mock:1880' })
})
const server = http.createServer((req, res) => {
console.log('here here http non secure', req.url)
proxy.web(req, res, { target: 'http://mock:1880' })
})
server.on('upgrade', (req, socket, head) => {
console.log('here here socket', req, socket, head)
proxy.ws(req, socket, { target: 'ws://mock:1880/signalr' })
})
proxy.listen(8010)
secureServer.listen(8001)
server.listen(8000)
})
Но независимо от того, что я делаю, событие upgrade
никогда не будет вызвано.
Так, как мне издеваться над websocket, используя этот прокси?