每周npm模块源码解读:http-proxy
2018-09-30 字数统计:2.5k 字 阅读时长 ≈ 2 分钟

补 周2018.9.24 ~ 2018.9.30

前言

模块名:http-proxy

github: https://github.com/nodejitsu/node-http-proxy

描述:是一个http代理库并支持websocket。适用于反向代理和负载均衡

适合人群:至少看过一遍源码

正文

在函数 ProxyServer 上定义属性并赋值为代理的实例。当使用 http-proxy 时,类 ProxyServer 会继承 EventEmitter3 ,选项 perpendPath 默认为true。

定义了类属性 webproxyRequestwsproxyWebsocketRequest 并赋值为创建正确的代理函数(web,websocket)。

定义类属性 webPasseswsPasses ,分明是web和websocket的pass集合。

接着注册了一个 error 的监听器。以及5个类方法。

方法 onError :在触发 error 事件时,执行的此方法。

方法 listen :创建一个http、https或者websocket的服务器。

方法 close :关闭服务器接着去执行回调。

方法 beforeafter :去判断默认的passes是否存在传入的passName,若不存在则报错。

用户可以选项来选择是http,https或者是websocket。以http举例:

当用户开启代理,发起请求,会执行一个自定义函数。选项中的 targetforward 的值会被解析。接着去执行每一个pass。

deleteLength :如果请求方法为delete或者options并且请求头’content-length‘存在,则将’content-length‘赋值为‘0’,并且删除请求头属性‘transfer-encoding’。

timeout :设置了选项 timeout ,则会去判断该请求是否超时。

Xheaders :设置了选项 xfwd 为 true,则会在请求头中添加‘x-forwarded-for’、‘x-forwarded-port’、‘x-forwarded-proto’和‘x-forwarded-host’属性。

stream :在此方法中通过流,执行代理。判断选项是否有 forward ,有则定义一个 http.request ,然后创建 forwardError ,接着将请求或者选项中的 buffer 用流的方式去传入这个请求。

新建一个已 targethttp.request ,注册事件 socket ,判断选项的 proxyTimeout ,来设置代理超时执行函数。

注册事件 aborted ,创建 proxyError 错误处理函数。将请求或者选项中的 buffer 用流的方式去传入这个 proxyReq 请求。

注册 respone 事件,并在该事件触发时,执行回调。判断响应是否存在 headersSent 和 选项中的 selfHandleResponse ,如分明为不存在或者为false,则执行 webOutcgoing 里的passes。

最后通过流传送响应值,关闭连接。

结语

不太复杂,但涉及到了http,https,websocket,有很多值得学习的点,如代理的‘x-forwarded’等。这个模块是7年前就开始了,还是有一些写法让小白迷惑。

除基本类型外,js一切皆为对象。