http 代理可分为两种,一种是普通的代理,作为中间人传递两边的信息;另一种则是隧道的方式。
普通代理 const http = require('http'); const url = require('url'); function request(cReq, cRes) { const u = url.parse(cReq.url); const options = { host: u.hostname, port: u.port || 80, path: u.path, method: cReq.method, headers: cReq.headers, }; const pReq = http.request(options, (pRes) => { cRes.writeHead(pRes.statusCode, pRes.headers); pRes.pipe(cRes); }).on('error', (e) => { console.error(e); cRes.end(); }); cReq.pipe(pReq); } http.createServer().on('request', request).listen(8888, '0.0.0.0'); 以上代码简单挑明了一个 http 代理的基本原理,但是还不能趋于实用。它只能用于代理 http 网站,由于 https 是基于 SSL/TSL 的,在传输层上实现,所以单单进行应用层代理无法正确处理 https 网站。