Невозможно прокси-запрос веб-сокета, используя переменную окружения docker и node-http-proxy - PullRequest
0 голосов
/ 06 мая 2019

Я хочу смоделировать 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, используя этот прокси?

...