node如何响应客户端connect请求

客户端用axios发起请求:

axios.get('https://myip.ipip.net/',{
  proxy:proxy,
})
  .then(function (response) {
    console.log(response.data);
  })
  .catch(function (error) {
    console.log(error);
  })

1、比如我想实现http代理功能,服务端监听connect请求,收到请求后在转发之前会先判断客户端是否符合某些条件,符合的话进行代理,不符合也会响应客户端请求并且能携带message,比如响应407、502、200等等,而且能发送一段数据告知客户端哪里不符合
2、我下面的响应不对吗?为何客户端一直都是触发error事件?并且报错:Client network socket disconnected before secure TLS connection was established

httpTunnel.on('connect', (req, cltSocket, head) => {
  cltSocket.write('HTTP/1.1 200 Connection Established\r\n'+
'Proxy-agent: MITM-proxy\r\n'+
'\r\n');
 cltSocket.end()
})

我的理解是connect就是一个tcp链接,在http等应用层之下,那这样的话我cltSocket.write('HTTP/1.1 200............正常发送http报文客户端应该能响应才对,这到底是什么原理,什么逻辑??

阅读 3.5k
1 个回答

官网的例子是这样的。是可以跑的。

serverSocket.pipe(clientSocket);
clientSocket.pipe(serverSocket);
// cltSocket.end()
const http = require('http');
const net = require('net');
const { URL } = require('url');

// 创建 HTTP 隧道代理。
const proxy = http.createServer((req, res) => {
    console.log('createServer')
  res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' });
  res.end('响应内容');
});
proxy.on('connect', (req, clientSocket, head) => {
    console.log('connect')
  // 连接到原始服务器。
  const { port, hostname } = new URL(`http://${req.url}`);
  const serverSocket = net.connect(port || 80, hostname, () => {
    clientSocket.write('HTTP/1.1 200 Connection Established\r\n' +
                    'Proxy-agent: Node.js-Proxy\r\n' +
                    '\r\n');
    serverSocket.write(head);
    serverSocket.pipe(clientSocket);
    clientSocket.pipe(serverSocket);
  });
});

// 代理正在运行。
proxy.listen(1337, '127.0.0.1', () => {
    console.log('listen')
      // 向隧道代理发出请求。
      const options = {
        port: 1337,
        host: '127.0.0.1',
        method: 'CONNECT',
        path: 'www.lilnong.top:80'
      };

      const req = http.request(options);
      req.end();

      req.on('connect', (res, socket, head) => {
        console.log('已连接');

        // 通过 HTTP 隧道发出请求。
        socket.write('GET /cors/http-connectc HTTP/1.1\r\n' +
                     'Host: www.lilnong.top:80\r\n' +
                     'Connection: close\r\n' +
                     '\r\n');
        socket.on('data', (chunk) => {
          console.log(chunk.toString());
        });
        socket.on('end', () => {
        //   proxy.close();
        });
      });
});
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题