Модуль http Node.js не получает WS-запрос (используя https-proxy-agent)

Концепция проста: создание http-сервера, который перенаправляет запрос websocket на другой порт.

Вот код на моей стороне сервера:

  http.createServer(onRequest).listen(9999);
  function onRequest(request, response) {
    console.log(request);
    ...
  }

Поэтому, если http-сервер вообще получает какой-либо запрос, он должен распечатать запрос в консоли.

Затем на стороне клиента (также приложение node.js) код выглядит так:

    var HttpsProxyAgent = require('https-proxy-agent');
    var WebSocket = require('ws');
    ...
    var proxy = `http://${config.proxy.host}:${config.proxy.port}`;
    var options = url.parse(proxy);
    agent = new HttpsProxyAgent(options);
    ws = new WebSocket(target, {
      protocol: 'binary',
      agent: agent
    });

Теперь, когда я использую Charles для перехвата запроса, клиент действительно отправил запрос, вот форма завитка, захваченная Charles:

curl -H 'Хост: target.host.com:8080' -X CONNECT ' https://target.host.com:8080/'

проблема в том, что

  function onRequest(request, response) {
    console.log(request);
    ...
  }

на самом деле не получил -X CONNECT 'https://proxy.host.com:9999' запрос, или, по крайней мере, он не распечатал его (очевидно, он тоже не работал).

1 ответ

Решение
  var server = http.createServer(onRequest).listen(9999);
  server.on('connect', (req, cltSocket, head) => {
    const srvSocket = net.connect('8080', '127.0.0.1', () => {
      cltSocket.write('HTTP/1.1 200 Connection Established\r\n' +
                      'Proxy-agent: Node.js-Proxy\r\n' +
                      '\r\n');
      srvSocket.write(head);
      srvSocket.pipe(cltSocket);
      cltSocket.pipe(srvSocket);
    });
  });
Другие вопросы по тегам