HTTP-запрос узла с использованием существующего сокета

Я пытаюсь написать приложение express, которое проксирует HTTP-запросы через ssh-туннель. Пакет ssh2 может создать туннель, используя forwardOut(). Он создает поток, который подключается к порту на удаленной машине. Сейчас я пытаюсь перенаправить входящий HTTP-запрос через это соединение.

Проблема, с которой я сталкиваюсь, заключается в том, что каждая прокси-библиотека и даже библиотека HTTP, которую я нашел, создают новый сокет для хоста, но я хочу использовать поток из forwardOut() вместо нового сокета.

Я мог бы попытаться создать дополнительный сервер, который пересылает все через туннель, но создание дополнительных сокетов для каждого запроса звучит очень хакерски. Я надеюсь, что есть лучший способ.

Есть ли какая-нибудь библиотека, которая поддерживает использование существующего сокета/потока для HTTP-запроса?


person thammi    schedule 11.01.2016    source источник


Ответы (1)


Я тоже столкнулся с похожей ситуацией. Я использовал существующий сокет, вернув stream, созданный ssh2, в параметрах опции http.request() (HTTP-клиент Node.js). Некоторый пример кода:

var http = require('http');
var Client = require('ssh2').Client;

var conn = new Client();

conn.on('ready', function () {
  // The connection is forwarded to '0.0.0.0' locally.
  // Port '0' allows the OS to choose a free TCP port (avoids race conditions)
  conn.forwardOut('0.0.0.0', 0, '127.0.0.1', 80, function (err, stream) {
    if (err) throw err;

    // End connection on stream close
    stream.on('close', function() {
      conn.end();
    }).end();

    // Setup HTTP request parameters
    requestParams = {
      host: '127.0.0.1',
      method: 'GET',
      path: '/',
      createConnecion: function() {
        return stream; // This is where the stream from ssh2 is passed to http.request()
      }
    };

    var request = http.request(requestParams, function(response) {
      response.on('data', function (chunk) {
        // Do whatever you need to do with 'chunk' (the response body)
        // Note, this may be called more than once if the response data is long
      })
    });

    // Send request
    request.end();
  });
}).connect({
  host: '127.0.0.1',
  username: 'user',
  password: 'password'
});

У меня была проблема, когда socket.destroySoon() не был определен, в качестве обходного пути его можно определить до возврата stream. Вместо этого он просто вызывает socket.destroy(). Пример:

createConnection: function () {
    stream.destroySoon = function () {
        return stream.destroy();
    }

    return stream;
}

Примечание. Я не полностью тестировал примеры, поэтому используйте их на свой страх и риск.

person Zach    schedule 08.01.2017