简单的 HTTP 代理

这学期 TCP/IP 有课程设计任务,我选了一个 HTTP Proxy 的课题。话不多说,先来一行行解析下代码。

// 这三个模块是 `node` 内置模块
// `http` 为 `http` 模块
// `net` 为 `TCP` 模块( `http` 下层协议)
// `url` 为 `url` 解析工具
var http = require('http');  
var net = require('net');  
var url = require('url');

// 解析请求 `url`
// cReq 为 http.IncomingMessage,是一个可读流(Readable Stream)
// cRes 为 http.ServerResponse,是一个可写流(Writable Stream)
function request(cReq, cRes) {  
  var u = url.parse(cReq.url);
  var options = {
    hostname: u.hostname,
    port: u.port || 80,
    path: u.path,
    method: cReq.method,
    headers: cReq.headers
  };

  // 将代理收到的服务器返回结果 `pRes` 赋给 `cRes`
  var pReq = http.request(options, function(pRes) {
    cRes.writeHead(pRes.statusCode, pRes.headers);
    pRes.pipe(cRes);

  }).on('error', function() {
    cRes.end();
  });

  // .pipe() 方法是将 `cReq` 逐行读取写入到 `pReq` 中
  cReq.pipe(pReq);
}

// 在当前网络 (`0.0.0.0`) `:8080` 端口启动 `HTTP` 服务
http.createServer().on('request', request).listen(8080, '0.0.0.0');  

整个过程大概是这样的,简单清晰。只不过这里没有做任何错误处理,也不支持代理 https 协议。

Client <(cRes)<<->>(cReq)> Proxy <(pRes)<<->>(pReq)> Server