【问题标题】:What should I do with a CONNECT event?我应该如何处理 CONNECT 事件?
【发布时间】:2013-08-20 16:34:27
【问题描述】:

如果我在 Node.JS 中创建一个简单的服务器

var httpServer = http.createServer(callback);

httpServer.on('connect', function(req, socket, head){
    console.log('connect');
});

httpServer.listen(3128, '192.168.0.2');

收到connect事件后应该怎么办?

背景

  • 这将是一个代理服务器,提供 HTTP 和 HTTPS
  • 客户端连接到端口 3128
  • 当客户端发出 HTTPS 请求时,会触发 connect 事件

理想情况下,我想做的是将请求代理到端服务器,然后将响应提供给客户端。

但我在这里看不到任何用于执行此操作的 API。 connect 回调没有(request, response) 的常用参数,而是接受(request, socket, head)。

我如何满足请求并发出响应?

【问题讨论】:

标签: node.js sockets https proxy


【解决方案1】:

从头开始重写答案

这是一个简单的例子。
connect 事件处理程序已经传递了socket 对象,我们必须将其与远程连接的套接字绑定。

httpServer.on('connect', function(req, socket, head) {
  var addr = req.url.split(':');
  //creating TCP connection to remote server
  var conn = net.connect(addr[1] || 443, addr[0], function() {
    // tell the client that the connection is established
    socket.write('HTTP/' + req.httpVersion + ' 200 OK\r\n\r\n', 'UTF-8', function() {
      // creating pipes in both ends
      conn.pipe(socket);
      socket.pipe(conn);
    });
  });

  conn.on('error', function(e) {
    console.log("Server connection error: " + e);
    socket.end();
  });
});

【讨论】:

  • 谢谢,但没有帮助。我说的是服务 httpS 请求和处理使用 CONNECT 方法发出的请求
  • 我明白了。从头开始重写答案。
  • 感谢您花时间重写,它帮助了我很多:)
  • 我已经编辑了您的答案,它缺少返回给客户端的 200 OK 消息,但其他工作正常。
  • 谢谢。我在答案中包含了一个修正:socket.write 是异步函数,我们必须在发送标头后创建管道,在 write 函数的回调中。
猜你喜欢
  • 2016-08-04
  • 2021-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多