使用现有套接字的节点http请求

时间:2016-01-11 17:27:23

标签: node.js express http-proxy

我正在尝试编写一个express应用程序,它通过ssh隧道代理HTTP请求。包ssh2可以使用forwardOut()创建隧道。它创建一个连接到远程计算机上端口的流。我现在正尝试通过此连接转发传入的HTTP请求。

我面临的问题是我找到的每个代理库甚至HTTP库都会为主机创建一个新的套接字,但我想使用来自forwardOut()的流而不是新的套接字。

我可以尝试创建一个额外的服务器,通过隧道转发所有内容,但为每个请求创建额外的套接字听起来非常h​​acky。我希望有更好的方法。

是否有任何库支持使用现有的套接字/流来获取HTTP请求?

1 个答案:

答案 0 :(得分:1)

我也遇到了类似的情况。我通过在stream(Node.js HTTP客户端)的选项参数中返回由ssh2创建的http.request()来使用现有套接字。一些示例代码:

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;
}

注意:我没有对这些示例进行全面测试,因此请自行承担风险。