我正在尝试编写一个express
应用程序,它通过ssh隧道代理HTTP请求。包ssh2
可以使用forwardOut()
创建隧道。它创建一个连接到远程计算机上端口的流。我现在正尝试通过此连接转发传入的HTTP请求。
我面临的问题是我找到的每个代理库甚至HTTP库都会为主机创建一个新的套接字,但我想使用来自forwardOut()
的流而不是新的套接字。
我可以尝试创建一个额外的服务器,通过隧道转发所有内容,但为每个请求创建额外的套接字听起来非常hacky。我希望有更好的方法。
是否有任何库支持使用现有的套接字/流来获取HTTP请求?
答案 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;
}
注意:我没有对这些示例进行全面测试,因此请自行承担风险。